[objective-c] Objective-C 코드가 Class에서 신속한 확장을 호출 할 수 있습니까?

일부 게시물을 검색했는데 신속하게 확장 기능을 작성할 수 없다고 생각하고 Objective-C 코드에서 호출 할 수 있습니까?

@objc와 같은 속성은 메서드, 클래스, 프로토콜 만 지원합니까?



답변

Swift 확장을 작성하여 Objective-C 코드에서 사용할 수 있습니다. XCode 6.1.1로 테스트되었습니다.

당신이해야 할 일은 :

  • Swift에서 확장 기능 생성 ( @objc주석 없음 )

  • #import "ProjectTarget-Swift.h" Objective-C 클래스에서 ( “ProjectTarget”은 Swift 확장과 연관된 XCode 대상을 나타냄)

  • Swift 확장에서 메소드 호출

업데이트 :
@Rizwan Ahmed가 언급했듯이 @objc주석 을 추가해야합니다 .

Swift 4.0.3부터 Objective C 클래스 파일에서 확장을 사용하려면 @objc 주석이 필요합니다.


답변

나는 Swift 4.0에서 내가 확장하고있는 Objc 클래스의 인스턴스에서 Swift 확장 메소드를 볼 수 있도록하기 위해 확장 키워드 @objc앞에 추가해야한다는 것을 알았습니다 .

요컨대 :

파일 구성 설정 :

CustomClass.h
CustomClass.m
CustomClassExtension.swift

CustomClassExtension에서 :

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

내 AppDelegate.m에서 :

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


답변

이 솔루션은 Swift 2.2 및 Swift 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)
    }
}

그런 다음 ObjC 파일에서 “ProductModuleName-Swift.h”#import 합니다.

스위프트 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). 이러한 범주는 Objective-C 대응 범주에 자동으로 연결되지 않습니다. 이 문제를 해결하려면 Objective-C 유형을 사용하거나 (그리고를 사용하여 Swift 코드에서 반환 값을 캐스트 as String) Swift 및 Objective-C 유형 모두에 대한 확장을 정의해야합니다.


답변

가져 오기 “# import를”ProductModuleName-Swift.h “ 목표 – C 파일의 헤더와 추가 @objc 당신의 뿅 extentsion 신속한 파일을. 그것은 빠른 4.2 빠른 5에서 잘 작동합니다


답변