无法在 Swift 中扩展 Objective-C 类

Posted

技术标签:

【中文标题】无法在 Swift 中扩展 Objective-C 类【英文标题】:Not able to extend an Objective-C class in Swift 【发布时间】:2016-09-01 11:50:32 【问题描述】:

我在 Xcode 8.0 beta 上使用 Swift 3.0。我已经使用 pods (FMDB) 安装了一个库,现在我正在尝试快速扩展它的一个类。我可以使用扩展类中的 API,但它在运行时崩溃。

-[FMResultSet polygonsForColumnIndex:]: unrecognized selector sent to instance 0x608000056890

下面是扩展的代码:

public extension FMResultSet 

    public func polygons(forColumnIndex index: Int32) -> [NMAMapPolygon] 

调用时会在此处崩溃:

let rs = db.executeQuery("select AsGeoJSON(geometry) from COM262_Project", withArgumentsIn: nil)
        while (rs?.next())! 

            //Crashes here!
            let polygons = rs?.polygons(forColumnIndex: 0)    
        

注意:扩展适用于 Alamofire 等其他库。

【问题讨论】:

其余的错误说明了什么? -[FMResultSet polygonsForColumnIndex:]:无法识别的选择器发送到实例 0x608000056890 方法怎么调用? 这种似乎是 UI 问题。请仔细检查您的参考资料是否缺少/未使用的连接。 我在上面定义了一个扩展,它工作正常。我无法重现您的问题。问题出在其他地方。我知道这听起来很烦人,但鉴于我们无法重现此问题,我建议您确定此问题表现出来所需的精确步骤。例如,创建一个空白项目并添加重现问题所需的最少数量。然后,您可以共享重现问题所需的精确步骤。但在我们能够重现问题之前,很难为您提供帮助。顺便说一句,我假设您使用的是 Xcode 8 beta 6 (8S201h)? 【参考方案1】:

您是否尝试将函数设置为@objc 例如

public extension FMResultSet 
    @objc public func polygons(forColumnIndex index: Int32) -> [NMAMapPolygon] 

除此之外,您是否将构建设置 Enable Modules 更改为 Yes.. 或者如果您使用配置文件 CLANG_ENABLE_MODULES = YES

【讨论】:

试过了,但没有成功。

以上是关于无法在 Swift 中扩展 Objective-C 类的主要内容,如果未能解决你的问题,请参考以下文章

无法访问扩展 Objective-C 类的 Swift 类中的私有变量

在 Swift 中使用 Objective-C 扩展类

使用 Objective-C 类别扩展 Swift 类

从 Objective-C 访问 Swift 扩展

如何从 Swift 扩展访问 Objective-C 类的私有成员?

我可以防止将扩展导出到 Objective-C 的 Swift 标头吗?