programing

Objective-C 클래스에서 Swift 함수

topblog 2023. 9. 5. 19:32
반응형

Objective-C 클래스에서 Swift 함수

. 저는 Objective-C" 파일을 . 파일을 만들었습니다.<ProjectName>-Bridging-Header.h그리고 "<ProjectName>-Swift.h"

제가 스위프트에서 오브젝티브-C로 함수를 호출하는 것은 쉬웠지만, 반대로 문제가 있습니다.

그래서 저는 간단한 클래스 "시스템"을 만들었습니다.스위프트

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 Class에서 가져온 것입니다.내 목표-C 코드의 목표 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에 대한 정의되지 않은 기호: "ObjectiveC_Class_"의 objc-class-ref에서 참조된 "ObjC_CLASS$_System"That_Call_Swift_Object.old: 아키텍처 i386에 대한 기호를 찾을 수 없습니다. clang: 오류: 링커 명령이 종료 코드 1에서 실패했습니다( 호출을 보려면 -v 사용).

이것은 이상하지만 우리가 한 후에 작동할 것입니다.

  1. 더하다@objc스위프트 Swift")로.MySwiftClass").

  2. 합니다. 즉, Obj-C 추니다. 즉,.m파일 이름:

    #import "(ProjectName)-Swift.h"
    
  3. 헤더 .h로 선언

    @class MySwiftClass;
    

는 컴일러다대생인성다니합를스이에 대한 를 생성할 것입니다.@objc에 있어서 현저한 등급.MyModuleName-Swift.hjava.

자동 생성 Obj-C 예제:

SWIFT_CLASS("_TtC10Project17220PLHelper")
@interface PLHelper

+ (void)notifyForDownloading:(NSDictionary *)userInfo;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

문제 해결됨, 이전에 새로 만들고 포함했습니다..h이름이 지정된 내 목표-C 클래스의 파일<ProductModuleName>-Swift.h그러나 나중에 알게 된 것처럼 컴파일러가 필요한 파일을 보이지 않게 만들기 때문에 이 단계는 필요하지 않습니다.

간히포함을 포함합니다.<ProductModuleName>-Swift.h당신의 수업에서 그리고 그것은 효과가 있을 것입니다.

프로젝트 이름 "MyFirstProjectOnSwift"와 스위프트 클래스 이름 "mySwiftClass"가 있으며 목표 C 클래스가 "MyObjectiveCLASS"라고 가정합니다.

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

  1. #import "MyFirstProjectOnSwift-Swift"를 추가합니다."MyObjectiveCLASS"에서 h.m"

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

  3. 그런 다음 MyObjectiveCLASS.m에서

    mySwiftClass *myClass = [mySwiftClass new]; {swiftmethod를 부르고 싶은 곳이면 어디든 이렇게 불러주세요.}

  4. [myClass methodName];

목표 C: .m 파일에 가져오기가 있는 -Swift.h 파일을 확인합니다.

#import <YourProjectName-Swift.h>

해당 줄을 누른 후 [정의로 이동]을 누릅니다.

이 파일은 수동이 아니라 자동으로 포함되어야 합니다.

이 게시물에 걸려 넘어지는 사람과 다른 답변이 통하지 않는 사람을 위한 추가 팁은 거의 없습니다. 스위프트 클래스를 "공개"로 선언해야 할 수도 있습니다.

예:

@objc public class MySwiftClass: NSObject {

가져온 후에도 클래스가 표시되지 않는 경우<ProductModuleName>-Swift.h.

클래스가 네이티브 클래스의 하위 클래스인지 확인합니다(예:UIViewController) 또는 적어도 유틸리티 클래스인 경우 하위 클래스로 만듭니다.NSObject이제 클래스가 표시됩니다.

Obj-C에서 Swift로 마이그레이션되는 프로젝트에서 Objective-C에서 Swift 코드를 실행하는 방법은 Bridge/Proxy 패턴을 사용하는 것이 좋습니다.

  1. 브리지를 구현합니다.

import Foundation

@objc class AnalyticsPropertyBridge: NSObject {

private var analytics: AnalyticsManager = AnalyticsManager()

@objc func refreshProperties() {

    self.analytics.set(AnalyticsProperty.clientType)
}

}

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

#import "CallerModule.h"

  1. 마지막으로 caller.m 파일에서 두 가지 문제가 발생했습니다.

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

#import "MyProject-Swift.h"

3.b 다리를 불러요.

[[AnalyticsPropertyBridge new] refreshProperties];

이점:objc에서 코드가 호출되기 때문에 당신의 swift code는 @objc로 더러워지지 않을 것입니다.시간이 지남에 따라 프로젝트에서 ObjC가 줄어들고 마침내 신부가 제거될 것입니다.

프로젝트 이름에 공백이 있는 경우 프로젝트 이름에 대한 참고 사항을 밑줄로 바꾸십시오. 예를 들어 프로젝트 이름이 "내 프로젝트"인 경우 다음을 포함해야 합니다.

#import <My_Project-Swift.h>

누군가 여전히 문제가 있다면 좋은 기사입니다.

Swift 및 Objective-C 상호 운용성 설정

  1. 이 문서에서는 Swift 파일을 ObjC로 가져오는 방법과 Objc 파일을 Swift로 가져오는 방법에 대해 자세히 설명합니다.
  2. 또한 프로젝트 이름에 공백이 있을 때 일반적으로 발생하는 문제도 해결합니다.
  3. 또한 "제품 모듈 이름" 플래그에 대해서도 설명합니다.

언급URL : https://stackoverflow.com/questions/24078043/call-swift-function-from-objective-c-class

반응형