Objective-C 내에서 Swift 클래스를 사용할 수 없습니다.
는 통합하려고 .Swift내 앱에 코드가 있습니다.내 앱은 다음 위치에 있습니다.Objective-C는 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.Swift수업. 여기에 설명된 건 다 했어요.하지만 문제는Xcode 창시하지 않았다-Swift.h★★★★★★★★★★★★★★★★★★★★★★★★그래서 제가 만들었는데, 사실 비어있어요.Swift에서는 ObjC 수업을 모두 사용할 수 있지만 그 반대로는 사용할 수 없습니다.는 는는 with my my my my 로 표시했다.@objc하지만 소용이 없어.제제어 떻떻? ???
같이 말합니다:"Swift Objective-C에 때 "Swift 코드를 "에 합니다.Xcode-generated에 "."를 합니다.[...] Swift는 Swift는 "-Swift는 "-Swift"를 추가합니다.아아아아아아아아아아아아아아아아아아아아아아
이 파일을 Import 할 때, 다음의 에러가 표시됩니다.
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
FBManager.swift 파일은 다음과 같습니다.
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
4시간 정도 걸렸어요Swift 집에서는XcodeObjective-C My 나 myproject-Swift.h작성되었지만, 의 파일은 정상적으로 작성되었습니다.XcodeSwift-classes저는 로 했습니다.XcodeObjc 기반 프로젝트, 그리고 마침내 정답을 찾았습니다!에게 도움이
Xcode Objc 기반 프로젝트를 위한 단계별 Swift 통합:
- 「」을 작성하다
*.swift【X】【파인더】【파인더】【XX】【파견】 - 작성하다
Objective-C bridging headerXcode(Xcode). Swift 클래스 구현:
import Foundation // use @objc or @objcMembers annotation if necessary class Foo { //.. }빌드 설정을 열고 다음 파라미터를 확인합니다.
- 모듈 정의:
YES검색 줄에 매개 변수 이름 복사 & 붙여넣기
- 제품 모듈 이름:
myproject제품 모듈 이름에 특수 문자가 포함되어 있지 않은지 확인하십시오.
- Objective-C 호환성 헤더 설치:
YES를 추가하면
*.swift은 빌드 됩니다. - Objective-C 생성 인터페이스 헤더:
myproject-Swift.h이 헤더는 Xcode에 의해 자동으로 생성됩니다.
- Objective-C 브리징 헤더:
$(SRCROOT)/myproject-Bridging-Header.h
- 모듈 정의:
*.m 파일에 Swift 인터페이스 헤더를 Import합니다.
#import "myproject-Swift.h"오류 및 경고에 주의를 기울이지 마십시오.
- Xcode 프로젝트를 청소하고 재구축합니다.
- 이익!
헤더 파일을 직접 작성하지 마십시오.작성한 것을 삭제합니다.
에 Swift 태그가 붙어 있는지 합니다.@objc또는 (간접적으로 또는 간접적으로) 유래하는 클래스에서 상속하는NSObject.
프로젝트에 컴파일러 오류가 있는 경우 Xcode에서 파일이 생성되지 않습니다. 프로젝트를 깨끗하게 빌드하십시오.
Xcode가 작업을 수행하도록 허용하고 Swift 헤더를 수동으로 추가/작성하지 마십시오.Swift 클래스 ex 앞에 @objc를 추가합니다.
@objc class YourSwiftClassName: UIViewController
프로젝트 설정에서 아래 플래그를 검색하여 YES(프로젝트와 타겟 모두)로 변경합니다.
Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES
그런 다음 프로젝트를 청소하고 빌드한 후 (아마도 빌드 성공 후) objective-class.m 파일의 아래 헤더 파일을 Import합니다.
#import "YourProjectName-Swift.h"
부웅!
또, 프레임워크의 타겟을 가지고 계신 분에게도 도움이 될 것입니다.
자동 생성된 헤더 파일의 Import문이 앱 대상과 조금 다르게 보입니다.다른 답변에 언급된 다른 사항 외에 사용
#import <ProductName/ProductModuleName-Swift.h>
대신
#import "ProductModuleName-Swift.h"
프레임워크 타깃의 Mix & Match에 관한 Apple 문서에 따라 주세요.
상세: Xcode 8.1의 Swift 3 코드를 사용한 Objective-C 프로젝트
작업:
- objective-c 클래스에서 swift 열거 사용
- swift 클래스에서 objective-c enum을 사용합니다.
풀샘플
1. Swift 열거를 사용하는 Objective-C 클래스
ObjcClass.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ObjcEnum) {
ObjcEnumValue1,
ObjcEnumValue2,
ObjcEnumValue3
};
@interface ObjcClass : NSObject
+ (void) PrintEnumValues;
@end
ObjcClass.m
#import "ObjcClass.h"
#import "SwiftCode.h"
@implementation ObjcClass
+ (void) PrintEnumValues {
[self PrintEnumValue:SwiftEnumValue1];
[self PrintEnumValue:SwiftEnumValue2];
[self PrintEnumValue:SwiftEnumValue3];
}
+ (void) PrintEnumValue:(SwiftEnum) value {
switch (value) {
case SwiftEnumValue1:
NSLog(@"-- SwiftEnum: SwiftEnumValue1");
break;
case SwiftEnumValue2:
case SwiftEnumValue3:
NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
break;
}
}
@end
Objective-C 코드에서 Swift 코드 탐지
제 샘플에서는 SwiftCode.h를 사용하여 Objective-C의 Swift 코드를 검출하고 있습니다.이 파일은 자동으로 생성되며(프로젝트에서 이 헤더 파일의 실제 복사본을 만들지 않았습니다), 이 파일의 이름만 설정할 수 있습니다.
컴파일러가 헤더 파일 Swift 코드를 찾을 수 없는 경우 프로젝트를 컴파일해 보십시오.
(2) Objective-C 열거를 사용하는 스위프트 클래스
import Foundation
@objc
enum SwiftEnum: Int {
case Value1, Value2, Value3
}
@objc
class SwiftClass: NSObject {
class func PrintEnumValues() {
PrintEnumValue(.Value1)
PrintEnumValue(.Value2)
PrintEnumValue(.Value3)
}
class func PrintEnumValue(value: ObjcEnum) {
switch value {
case .Value1, .Value2:
NSLog("-- ObjcEnum: int value = \(value.rawValue)")
case .Value3:
NSLog("-- ObjcEnum: Value3")
break
}
}
}
Swift 코드에서 Objective-C 코드 검출
브리징 헤더 파일을 작성해야 합니다.Objective-C 프로젝트에서 Swift 파일을 추가하거나 swift 프로젝트에서 Objective-C 파일을 추가하는 경우 Xcode는 브리징 헤더를 생성하도록 제안합니다.
브리징 헤더 파일명은 여기서 변경할 수 있습니다.
Bridging-Header.h
#import "ObjcClass.h"
사용.
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
결과
더 많은 샘플
위에서 설명한 목표-c 및 Swift의 완전한 통합 단계.이제 다른 코드 예를 몇 가지 작성하겠습니다.
3. Objective-c 코드에서 Swift 클래스를 호출합니다.
스위프트 클래스
import Foundation
@objc
class SwiftClass:NSObject {
private var _stringValue: String
var stringValue: String {
get {
print("SwiftClass get stringValue")
return _stringValue
}
set {
print("SwiftClass set stringValue = \(newValue)")
_stringValue = newValue
}
}
init (stringValue: String) {
print("SwiftClass init(String)")
_stringValue = stringValue
}
func printValue() {
print("SwiftClass printValue()")
print("stringValue = \(_stringValue)")
}
}
목표 C 코드(발신 코드)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
결과
4. Swift 코드에서 Objective-c 클래스를 호출합니다.
Objective-C 클래스(ObjcClass.h)
#import <Foundation/Foundation.h>
@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end
ObjcClass.m
#import "ObjcClass.h"
@interface ObjcClass()
@property NSString* strValue;
@end
@implementation ObjcClass
- (instancetype) initWithStringValue:(NSString*)stringValue {
NSLog(@"ObjcClass initWithStringValue");
_strValue = stringValue;
return self;
}
- (void) printValue {
NSLog(@"ObjcClass printValue");
NSLog(@"stringValue = %@", _strValue);
}
- (NSString*) stringValue {
NSLog(@"ObjcClass get stringValue");
return _strValue;
}
- (void) setStringValue:(NSString*)newValue {
NSLog(@"ObjcClass set stringValue = %@", newValue);
_strValue = newValue;
}
@end
스위프트 코드(발신 코드)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
결과
5. Objective-c 코드에서 Swift 확장자를 사용합니다.
신속한 확장
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
목표 C 코드(발신 코드)
[UIView swiftExtensionFunc];
6. 스위프트 코드에서 Objective-c 확장자를 사용한다.
목표 C 확장(UIView Extension).h)
#import <UIKit/UIKit.h>
@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end
UIView Extension.m
@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
NSLog(@"UIView objcExtensionFunc");
}
@end
스위프트 코드(발신 코드)
UIView.objcExtensionFunc()
프로젝트에서 모듈을 정의하고 모듈 이름을 지정했는지 확인하십시오. 다음는 Xcode를 .-Swift.h수입하다
프로젝트 설정에서 모듈 정의 및 모듈 이름을 설정할 수 있습니다.
같은 문제가 있었는데 모듈 이름의 특수 기호가 xcode로 대체되었습니다(내 경우 대시는 밑줄로 표시됨).프로젝트 설정에서 "모듈 이름"을 선택하여 프로젝트의 모듈 이름을 찾습니다. 후, 「 」를 사용합니다.ModuleName-Swift.h이치노
Xcode 6.3.2의 코드입니다.파생 데이터 your your로 한 후@objc컴파일 후 , , , , , , " " "Swift.h[Derived Data] (파생 데이터)입니다.재빠르다
가 내 Xcode로 을 바꾼 것이가 .my-Project-Swift.h로로 합니다.my_Project-Swift.hXcode를 않는다."." "-"클래스로 수 .Objective-C Import.
Swift 5의 경우:
- , 그럼 여기에다가 더해져요.
@objc및 로 설정합니다. public및 로 설정합니다.- .
NSObject - 프로젝트 구축
놓다를
#import "MyProject-Swift.h"fileObjective-C에@objc public class MyClass: NSObject { @objc public func myMethod() { } }
#import "my Project-Swift"만 포함하면 됩니다..m 또는 .h 파일의 h"
추신 "my Project-Swift"는 찾을 수 없습니다.파일 인스펙터의 h"는 숨겨져 있습니다.하지만 앱에서 자동으로 생성됩니다.
@sig 답변은 가장 좋은 답변 중 하나입니다만, 이전 프로젝트에서는 효과가 없었습니다(새로운 것이 아닙니다). 약간의 수정이 필요했습니다.많은 변형을 거쳐 레시피를 찾았습니다(XCode 7.2 사용).
- 제품 모듈명 : $(PRODUCT_NAME:c99 확장자)
- 모듈 정의: NO
- 포함된 콘텐츠에는 Swift가 포함되어 있습니다.
- Objective-C 호환성 헤더 설치 : YES
- Objective-C 브리징헤더 : ProjectName-Bridging-Header.h
마지막 포인트(5)가 중요했다.두 번째 섹션(Targets 필드)에만 두었습니다. Project 필드는 비워 두어야 합니다.
그렇지 않으면 적절한 "프로젝트 스위프트"가 생성되지 않았습니다.h" 파일(swift 메서드는 포함되지 않았습니다).
두 가지 조건이 있습니다.
- 목표 c 파일에서 swift 파일을 사용합니다.
- swift 파일의 목적 c 파일을 사용합니다.
그러기 위해서는, 다음의 순서를 실행할 필요가 있습니다.
- swift 파일을 objective-c 프로젝트에 추가하거나 그 반대로 추가합니다.
- 헤더(.h) 파일을 만듭니다.
「빌드 설정」으로 이동해, 다음의 검색 순서를 실행합니다.
- 이 텍스트 "brid"를 검색하여 헤더 파일의 경로를 설정합니다.
- "모듈 정의": 네.
- "Always Embed Swift Standard Libraries" : 네.
- "Install Objective-C Compatibility Header" : 예.
그런 다음 프로젝트를 정리하고 재구축하십시오.
목표 c 파일에서 swift 파일을 사용합니다.
그렇다면, 먼저 수업 전에 "@objc"라고 빠른 파일로 쓰세요.
그 후, 당신의 목표 c 파일에 이것을 쓰세요.
#import "YourProjectName-Swift.h"
swift 파일의 목적 c 파일을 사용합니다.
그렇다면, 당신의 헤더 파일에 이것을 쓰세요.
#import "YourObjective-c_FileName.h"
이것이 당신에게 도움이 되길 바랍니다.
내 경우 다음 단계를 제외하고:
- 제품 모듈명 : my project
- 모듈 정의 : YES
- 삽입 콘텐츠 포함 Swift : YES
- Objective-C 호환성 헤더 설치 : YES
- Objective-C 브리징 헤더 : $(SRCROOT)/소스/SwiftBridging.h
productName-Swift.h 파일을 작성하기 위해 클래스를 공개해야 했습니다.
import UIKit
@objc public class TestSwift: NSObject {
func sayHello() {
print("Hi there!")
}
}
프로젝트에 swift 파일의 디렉토리를 추가할 수 없다는 것을 방금 알았습니다.먼저 디렉터리에 대한 그룹을 만든 다음 swift 파일을 추가해야 합니다.
나도 같은 문제가 있었는데 결국 그들이 같은 타겟에 붙어있지 않은 것 같았다.ObjC 클래스는 Target1 및 Target2에 연결되며 Swift 클래스는 Target1에만 연결되며 ObjC 클래스에는 표시되지 않습니다.
이게 도움이 됐으면 좋겠네요.
나의 문제는 xcode가 브리지 파일을 만든 후에 막혔는데, 여전히 헤더 파일 이름 MYPROJECTNAME-swift.h에 오류가 발생하였습니다.
1. 터미널에 체크인하여 자동으로 생성된 모든 스위프트브리지 파일을 검색합니다.
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
어떤 xcode가 생성되었는지 알 수 있습니다.
- 제 경우 프로젝트명에 공백이 있어서 xcode 치환하면 '_'입니다.
프로젝트에 새 Swift 파일을 추가할 때는 올바른 대상에 파일을 추가해야 합니다.사용하는 모든 swift 파일이 NSObject 클래스를 상속하고 빌드 설정 내에서 ALways_EMBED_SWIFT_STANDARD 옵션에서 @ObjCMembers Change to YES로 주석을 달았는지 확인하십시오.라이브러리DEFINE_MODULE 옵션 아래의 빌드 설정 내에서 YES로 변경합니다.
Objective-C에서의 Swift 클래스 사용
Target 내에서 ) 행 Target을 사용해야 합니다.#import "<#YourProjectName#>-Swift.h"Swift 코드를 Objective-C 코드에 노출하다
이 게시물에서는 Swift 정적 라이브러리를 Objective-C 코드로 Import하는 방법에 대해 설명합니다.
목표 C 컨슈머 -> Swift 스태틱 라이브러리
Xcode 버전 10.2.1
Swift 정적 라이브러리 생성
다음 추가 사항:
Swift API를 표시합니다.Objective-C의[대략] Swift 함수를 사용하려면
을 하고 '아주 좋다'가 있을 예요.<product_name>-Swift.h 배치해야 할 DerivedSources 을 찾을 수 파일을 찾을 수 없습니다]
Swift 스태틱 라이브러리가 있는 Objective-C 컨슈머
Drag and dropXcode[대략] 프로젝트로의 바이너리
Link Library[미정의 기호] [링크와 임베디드]
Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
Library Search paths 수 ][라이브러리를 찾을 수 없음] 경로 [재귀 경로]
Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file
Header Search Paths 을 찾을 수 없습니다듈을찾찾 을을]] ] 경로 [재귀 경로]
Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file
「」을 추가합니다..swift fileObjective-C 프로젝트에 [미정의 기호]할당됩니다.Xcode가 요청하면 Create를 누릅니다.Bridging Header합니다).module_name-Bridging-Header.h및에 이 의 경로를 합니다.
Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header
모듈을 Objective-C 클라이언트[파일을 찾을 수 없습니다] 코드로 Import합니다.
#import "module_name-Swift.h"
도 같은 를 하고 있다: 같같 i i i i i i i i i i i i i i i i i i 。myProjectModule-Swift.h을 찾을 수 없습니다」라고 하는 것은 제는 「을 찾을 수 없습니다」라고 하는 「파일을 찾을 수 없습니다.」라고 하는, 「파일을 찾을 수 없습니다.」라고 하는, 는 잘못된 타겟에 .Swift는 10.9 할 수 없습니다. X 10.9 를 설정해 .정해해설MACOSX_DEPLOYMENT_TARGET '로 9로 때 되었습니다.
문제는 -swift.h 파일의 자동생성이 CustomDebugStringConvertible 서브클래스를 인식할 수 없다는 것입니다.대신 NSObject의 하위 클래스로 클래스를 변경했습니다.그 후 -swift.h 파일에 클래스가 올바르게 포함되었습니다.
오브젝트 c 브리징헤더에 클래스를 추가하는 문제가 있었는데 Import된 오브젝트 c 헤더에서는 스위프트헤더를 Import하려고 했습니다.그건 싫었어요.
따라서 swift를 사용하지만 브리징된 모든 objective-c 클래스에서 중요한 것은 헤더에서 정방향 클래스 선언을 사용하고 "*-Swift"를 Import하는 것입니다..m 파일에 h" 파일이 있습니다.
빌드 설정을 변경하거나 클래스에 @obj를 추가할 필요가 없었습니다.
제가 해야 할 일은 Objective-c 프로젝트에 Swift 클래스를 만들 때 자동으로 생성되는 브리지 헤더를 만드는 것이었습니다.그리고 난 그냥 해야 했어
"침대-스위프트"를 가져오다.h" <- inside objective-c 파일입니다.
음, 모든 코멘트를 읽고, 읽고, 읽고, 그리고 다시 한 번 시도한 후에, 저는 빠른 수업을 제 빅 obj-c 프로젝트에 포함시킬 수 있었습니다.도와주셔서 감사합니다.과정을 더 잘 이해하는 데 도움이 되는 팁을 하나 알려드리고 싶었습니다..m 클래스에서 swift target name #import "myTargetName-Swift" Import 행으로 이동합니다.h" 라고 입력하고,키를 클릭합니다.
명령 + 마우스 클릭 -> 정의로 점프
여기서 swift에서 obj-c로의 모든 변환을 볼 수 있으며, obj-c에서 선언된 다양한 기능을 찾을 수 있습니다.이 팁이 나에게 도움이 된 만큼 당신에게도 도움이 되기를 바랍니다.
XCode 11.3.1:
swift inner 클래스를 objc 코드로 사용하고 싶은 경우, 에러 「미정의의 심볼」(need inner class와 outer class의 경우)에 대해서 컴파일 되지 않는 경우는, 생성된 「-swift」를 체크했습니다.h" 헤더와 양쪽 클래스가 있습니다.
몇 시간 동안 시도한 후 내부 클래스를 일반 클래스로 변환하면 컴파일됩니다.
프로젝트를 정리하고 Derived Data 폴더를 삭제하면 컴파일 됩니다.
수 에 는는코 the 、 는 i were from from from Swift를 삭제해야 .Objective-C Generated Interface Name도서관 자료와 상충되지 않도록 하기 위해서입니다.
아카이브는 이미 테스트 완료
목표 c 프로젝트에서 신속한 함수(스위트 프레임워크에 포함될 수도 있음)를 호출하거나 네이티브 프로젝트를 반응시키는 방법
리액트 리액트 리액트 리액트 리액트 리액트 리액트 리액션에도
빌드 설정을 열고 다음 파라미터를 확인합니다.모듈 정의 : YES
AppDelegate.h에 있습니다.
#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
@class KB;
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
@property (strong, nonatomic) KB *appkb;
@end
AppDelegate.m으로 이동합니다.
#import "AppDelegate.h"
#import "ProductModuleName-Swift.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self.appkb methodReceiveSwiftClass];
[self.appkb methodEvents:event prop:properties];
}
@end
KB.swift
import Foundation
// import framework if using a swift framework in objective c or react native native modules.
@objc public class KB:NSObject{
@objc public func methodReceiveSwiftClass(){
//write anything here....
}
@objc public func methodEvents(_ event: String, prop: String){
//write anything here
//func with params
}
}
Project Module Name-Bridging-Header.h
#import "React/RCTBridgeModule.h"
#import "AppDelegate.h"
위의 모든 작업을 수행해도 오류가 발생하였습니다.문제는 제가 필요로 하는 Swift 파일이 어떤 이유로 번들리소스에 추가되지 않았다는 것입니다.
[ My Target ]> [ Build Phases ]> [ Copy Bundle Resources ]순서로 이동하여 플러스 버튼을 클릭하여 Swift 파일을 추가했습니다.
언급URL : https://stackoverflow.com/questions/24206732/cant-use-swift-classes-inside-objective-c
'programing' 카테고리의 다른 글
| 윈도우즈 cmd 스크립트에서 여러 명령 실행 (0) | 2023.04.16 |
|---|---|
| npm ERR!오류: EPERM: 작업이 허용되지 않습니다. 이름을 변경하십시오. (0) | 2023.04.16 |
| $$가 부모 프로세스와 동일한 ID를 반환하는 이유는 무엇입니까? (0) | 2023.04.11 |
| registerForRemoteNotification타입: iOS 8.0 이후에서는 지원되지 않습니다. (0) | 2023.04.11 |
| Objective-C에서 Java의 "instance of" 키워드에 해당하는 것은 무엇입니까? (0) | 2023.04.11 |






