Objective-C 코드가 Swift 클래스 확장을 호출할 수 있습니까?
제가 몇 개의 게시물을 검색했는데, 스위프트 아래에 내선번호를 쓸 수 없는 것 같고, Objective-C 코드에서 호출하는 것 맞죠?
@objc
메소드, 클래스, 프로토콜만 지원하는 속성?
Swift 확장자를 작성하여 Objective-C 코드로 사용할 수 있습니다.Xcode 6.1.1로 테스트됨.
필요한 것은 다음과 같습니다.
Swift에서 내선번호 만들기 (
@objc
Swift 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.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)
}
}
그런 다음 #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
'programing' 카테고리의 다른 글
Twitter Bootstrap 3에서 버튼을 중앙에 배치하는 방법은? (0) | 2023.08.04 |
---|---|
"AJAX"를 사용하여 CSV 파일 다운로드 (0) | 2023.08.04 |
웹킷은 무엇이며 CSS와 어떤 관계가 있습니까? (0) | 2023.08.04 |
주 스레드 체커: 백그라운드 스레드에서 호출된 UI API: -[UIApplicationapplicationState] (0) | 2023.08.04 |
'key: value'마다 한 줄씩 사용하여 CSV 파일에 사전 쓰기 (0) | 2023.08.04 |