将实现协议的 Swift 类导入到 Objective-C 类中

Posted

技术标签:

【中文标题】将实现协议的 Swift 类导入到 Objective-C 类中【英文标题】:Importing a Swift class that implements a protocol into Objective-C class 【发布时间】:2017-11-07 23:36:21 【问题描述】:

我在 Swift 中有一个实现协议的类:

class SwiftClass: SwiftProtocol 
    func test() 
        NSLog("Test");
    

这是简单的协议

@objc protocol SwiftProtocol 
    func test()

当我将它导入并使用一个 Objective-C 类时,它给出了这个错误

使用未声明的标识符“SwiftClass”

    当我让 SwiftClass 扩展 NSObject 时,它工作正常。 在协议中添加和删除 @objc 会产生相同的错误。 2 个文件的 Target Membership 指向正确的项目。

有没有办法导入我的实现协议的类?我做错了什么?

【问题讨论】:

使用@objc class SwiftClass ... 有什么不同吗? SwiftClass 必须继承 NSObject 才能从 Objective-C 中使用它。当然,Objective-C 源代码必须 #import Swift 标头(例如,MyApp-Swift.h 或其他)。 【参考方案1】:

来自https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35,Swift 类型兼容性部分

当你创建一个继承自 Objective-C 类的 Swift 类时, 类及其成员——属性、方法、下标和 初始化器——与 Objective-C 兼容的会自动 可从 Objective-C 获得。

这与您观察到的一致:如果SwiftClass 扩展NSObject,它工作正常。这样解决问题有什么问题吗?

【讨论】:

谢谢!由于没有扩展 NSObject 的类在 Swift 中工作,我很困惑为什么它不能与 Obj-C 一起工作,但你为我完美地清除了它。非常感谢!!!

以上是关于将实现协议的 Swift 类导入到 Objective-C 类中的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Firebase 导入 Swift 类

将Swift类导入Objective c [复制]

来自符合协议的未知类的 Swift init

将 Swift 导入 Objective-C - “使用未声明的标识符”

无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性

从Objective-C向Swift转换学习到的经验