이전 Objective-C 프로젝트가 있고 새 Swift 함수와 개체를 호출하고 싶습니다. ” <ProjectName>-Bridging-Header.h
“및 ” <ProjectName>-Swift.h
” 파일을 만들었습니다.
Swift에서 Objective-C로 함수를 호출하기는 쉬웠지만 반대로 문제가 있습니다.
그래서 간단한 클래스 “System.Swift”를 만들었습니다.
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
이제 여기 에 문서를 따르려고 노력 했으며 <...>-Swift.h
파일 내부에 이것을 작성했습니다.
@class System;
@interface System : NSObject
-(void)printSome;
@end
Objective-C 클래스 내에서 가져 왔습니다. 이 시점에서 내 Objective-C 코드의 Objective C 클래스 (현재 UIViewController) 내에서 “printSome”메서드를 호출하려고했습니다.
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
이제 다음과 같은 오류가 있습니다.
아키텍처 i386에 대한 정의되지 않은 기호 : ” OBJC_CLASS $ _System”, 참조 : “ObjectiveC_Class_That_Call_Swift_Object”의 objc-class-ref : 아키텍처 i386에 대한 기호를 찾을 수 없음 clang : 오류 : 링커 명령이 종료 코드 1로 실패했습니다 (사용 -v 호출 참조)
답변
문제가 해결되었습니다. 이전에 Objective-C 클래스 .h
에 새 파일을 만들고 포함 시켰지만 나중에 발견 했듯이 컴파일러가 필요한 파일을 보이지 않게 만들기 때문에이 단계가 필요하지 않습니다.<ProductModuleName>-Swift.h
<ProductModuleName>-Swift.h
수업에 포함 하기 만하면 작동합니다.
답변
이상하지만 작동합니다
1) Add @objc to Swift class
2) Add in .m
#import "(ProjectName)-Swift.h"
3) Call from .h
@class SwiftClass;
4)On SwiftClass
click "Command" + Left Click (Apple Documantation)
5) To see "-Swift.h" -> click "Command" + Left Click
앱은 -Swift.h에서이 클래스에 대한 인터페이스를 생성합니다.
예 : SWIFT_CLASS ( “_ TtC10Project17220PLHelper”) @interface PLHelper
- (무효) notifyForDownloading : (NSDictionary *) userInfo;
- (인스턴스 유형) init OBJC_DESIGNATED_INITIALIZER; @종료
답변
ProjectName “MyFirstProjectOnSwift”와 신속한 클래스 이름 “mySwiftClass”가 있고 objectiveC 클래스가 “MyObjectiveCLass”라고 가정합니다.
다음 단계는 다음과 같습니다.
“MyObjectiveCLass.m”에 #import “MyFirstProjectOnSwift-Swift.h”를 추가합니다.
MyObjectiveCLass.h에 @class mySwiftClass를 추가합니다.
그런 다음 MyObjectiveCLass.m에서
mySwiftClass * myClass = [mySwiftClass new]; {빠른 메소드를 호출하려는 모든 메소드에서 이와 같이 호출하십시오.}
[myClass methodName];
답변
Objective-C에서 .m 파일에 가져 오기가있는 -Swift.h 파일을 확인하십시오.
#import <YourProjectName-Swift.h>
해당 줄을 클릭하고 왼쪽 클릭-정의로 이동.
이 파일은 수동이 아닌 자동으로 포함되어야합니다.
답변
를 가져온 후에도 여전히 수업이 표시되지 않는 경우 <ProductModuleName>-Swift.h
.
클래스가 네이티브 클래스 (예 :)를 서브 클래 싱하고 있는지 확인 UIViewController
하거나 적어도 유틸리티 클래스 인 경우 하위 클래스로 만듭니다 NSObject
. 이제 수업이 표시됩니다.
답변
이 게시물에 걸려 넘어지는 사람을위한 약간의 추가 팁과 다른 답변은 작동하지 않습니다. Swift 클래스를 “public”으로 선언해야 할 수도 있습니다.
예:
@objc public class MySwiftClass: NSObject {
답변
Obj-C에서 Swift로 마이그레이션되는 프로젝트에서 Objective-C에서 Swift 코드를 실행하는 권장 방법은 Bridge / Proxy 패턴을 사용하는 것입니다.
- Bridge를 구현하십시오.
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
private var analytics: AnalyticsManager = AnalyticsManager()
@objc func refreshProperties() {
self.analytics.set(AnalyticsProperty.clientType)
}
}
- 우산 파일 (Bridging-Header)에 objC 호출자 모듈을 포함합니다.
#import "CallerModule.h"
- 마지막으로 호출자 .m 파일에서 두 가지 문제가 있습니다.
3.a 우산 파일 가져 오기 :
#import "MyProject-Swift.h"
3.b 브리지를 호출합니다.
[[AnalyticsPropertyBridge new] refreshProperties];
이점 : 코드가 Objc에서 호출되기 때문에 신속한 코드가 @objc로 더러워지지 않습니다. 시간이 지남에 따라 프로젝트에서 ObjC가 줄어들고 마침내 신부가 제거됩니다.