[objective-c] Objective-C 클래스에서 Swift 함수 호출

이전 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”라고 가정합니다.

다음 단계는 다음과 같습니다.

  1. “MyObjectiveCLass.m”에 #import “MyFirstProjectOnSwift-Swift.h”를 추가합니다.

  2. MyObjectiveCLass.h에 @class mySwiftClass를 추가합니다.

  3. 그런 다음 MyObjectiveCLass.m에서

    mySwiftClass * myClass = [mySwiftClass new]; {빠른 메소드를 호출하려는 모든 메소드에서 이와 같이 호출하십시오.}

  4. [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 패턴을 사용하는 것입니다.

  1. Bridge를 구현하십시오.

import Foundation

@objc class AnalyticsPropertyBridge: NSObject {

private var analytics: AnalyticsManager = AnalyticsManager()

@objc func refreshProperties() {

    self.analytics.set(AnalyticsProperty.clientType)
}

}

  1. 우산 파일 (Bridging-Header)에 objC 호출자 모듈을 포함합니다.

#import "CallerModule.h"

  1. 마지막으로 호출자 .m 파일에서 두 가지 문제가 있습니다.

3.a 우산 파일 가져 오기 :

#import "MyProject-Swift.h"

3.b 브리지를 호출합니다.

[[AnalyticsPropertyBridge new] refreshProperties];

이점 : 코드가 Objc에서 호출되기 때문에 신속한 코드가 @objc로 더러워지지 않습니다. 시간이 지남에 따라 프로젝트에서 ObjC가 줄어들고 마침내 신부가 제거됩니다.