programing

Objective-C 코드가 Swift 클래스 확장을 호출할 수 있습니까?

closeapi 2023. 8. 4. 23:05
반응형

Objective-C 코드가 Swift 클래스 확장을 호출할 수 있습니까?

제가 몇 개의 게시물을 검색했는데, 스위프트 아래에 내선번호를 쓸 수 없는 것 같고, Objective-C 코드에서 호출하는 것 맞죠?

@objc메소드, 클래스, 프로토콜만 지원하는 속성?

Swift 확장자를 작성하여 Objective-C 코드로 사용할 수 있습니다.Xcode 6.1.1로 테스트됨.

필요한 것은 다음과 같습니다.

  • Swift에서 내선번호 만들기 (@objcSwift 4.0.3 이후 주석 필요)

  • #import "ProjectTarget-Swift.h"Object-C 클래스(여기서 "ProjectTarget"은 Swift 확장이 연결된 XCode 대상을 나타냄)

  • 스위프트 내선에서 메서드를 호출합니다.

Swift 4.0에서 추가해야 한다는 것을 알게 되었습니다.@objc확장 키워드 앞에서 Swift 확장 메서드를 확장하던 Objc 클래스의 인스턴스에서 볼 수 있습니다.

간단히 말해서:

파일 구성 설정:

CustomClass.h
CustomClass.m
CustomClassExtension.swift

사용자 지정 클래스 확장에서:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}

내 앱 대리인에게.m:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];

이 솔루션은 Swift 2.2Swift 3에서 작동합니다.Objective-C에서는 클래스에 대한 확장(구조체 또는 열거체에 대한 확장이 아님)만 액세스할 수 있습니다.

import UIKit

extension UIColor {

    //Custom colours
    class func otherEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

그런 다음 #import "ProductModuleName-Swift.h"를 입력합니다.

스위프트 4

extension UIColor {

    // As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
    @objc
    class func otherEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

다른 답변에서 다루었듯이 대부분의 경우 생성된 Swift 헤더를 가져오면 작동합니다.

이에 대한 예외는 범주가 브리지 유형에 정의된 경우(즉, 확장자가 다음에 정의된 경우)입니다.String그리고 아닌NSString). 이러한 범주는 목표-C에 해당하는 범주로 자동으로 연결되지 않습니다.이 문제를 해결하려면 목표-C 유형을 사용해야 합니다(그리고 스위프트 코드에서 반환 값을 캐스트합니다).as String) 또는 Swift 및 Objective-C 유형 모두에 대한 확장을 정의합니다.

"#import" ProductModuleName-Swift를 가져옵니다.objective-c 파일의 h" 헤더와 swift 파일의 확장자 앞에 @objc추가합니다.swift 4.2와 swift 5에서 잘 작동할 것입니다.

모든 것을 올바르게 구성했다고 생각하면(Swift 엔티티를 @objcMembers 또는 @objc로 표시) 브리징 헤더 "ProductModuleName-Swift"를 가져왔습니다.h" 등) – 하지만 여전히 이해하고 있습니다.No visible @interface for 'FooClass' declares the selector 'fooSelector'오류:

브리지 헤더에 인터페이스가 표시되는지 확인합니다.ctrl + cmd클릭합니다.그렇지 않으면 이 질문에 대한 내 대답을 확인하십시오: Swift to Objective-C 헤더에 Swift 클래스가 포함되어 있지 않습니다.

언급URL : https://stackoverflow.com/questions/27097688/can-objective-c-code-call-swift-class-extensions

반응형