从 Swift 访问 Objective-C 变量/函数

Posted

技术标签:

【中文标题】从 Swift 访问 Objective-C 变量/函数【英文标题】:Accessing Objective-C variables/functions from Swift 【发布时间】:2016-01-21 01:42:47 【问题描述】:

假设我有一个名为 Connector.m 的连接器(用 Objective-C 编写)。我想创建一个使用 Swift 编写的新连接器,命名为 Connector.swift。我想从 Swift 访问所有的变量和方法。我已经创建了一个桥接头并写入了连接器头文件的导入。但我无法访问 Objective-C 类中的任何全局变量。

Connector.m

NSString * const kHTTP_METHOD_GET = @"GET";

Connector.swift

public class Connector: NSObject 

    var parentConnector : Connector

    override init() 
        self.parentConnector = Connector
    

    func test() 
        print(parentConnector.kHTTP_METHOD_GET) //--> ERROR : Value of type 'Connector' has no member 'kHTTP_METHOD_GET'
    


可以这样做吗?谢谢。

【问题讨论】:

【参考方案1】:

确保你有这样的头文件...

project-name-Bridging-Header.h

在 Bridging-Header.h 中添加你的类文件

#import "Connector.h"

并将下面的代码放入 Connector.h 文件中。因为在 Bridging-Header.h 中只会导入头文件

NSString * const kHTTP_METHOD_GET = @"GET";

到@interface 范围的顶部..

【讨论】:

【参考方案2】:

在 Connector.h 中添加以下行。

extern NSString * const kHTTP_METHOD_GET;

将 Connector.h 包含到您的桥接头文件中。

【讨论】:

是否需要使用extern【参考方案3】:

我相信 Connector.m 中的方法/变量也需要公开才能正常工作。

【讨论】:

怎么做?顺便说一句,Connector.m 中的变量超出了@implementation 范围.. 加公众号public NSString * const kHTTP_METHOD_GET = @"GET"; 另外,你不是在尝试访问没有名为kHTTP_METHOD_GET 的成员的 swift 对象的实例吗?我认为您的 swift 类需要一个不同的名称。 我们不能在'@interface'范围之外添加'@'符号,并且全局变量不能在'@interface'上。 我是说,您的 parentConnector 是 Connector.swift 类型,而不是 Connector.h/m。所以它没有你想要的成员。您需要将 parentConnector 设置为您的 Objective-C 类的类型。【参考方案4】:

这听起来像是Adapter Pattern 的一个很好的用例。但是您应该能够轻松访问 Objective-C 代码。

确保您的桥接头文件命名如下:

your-project-name-Bridging-Header.h

在您的桥接头中添加以下内容:

#import "Connector.m"

那么你必须确保编译器知道你的桥接头:

点击您的根项目 > 选择您的目标应用 > 构建设置

然后向下滚动直到你看到这个:

确保列出您的桥接头,构建并且您应该可以访问您的 Objective-C 代码。

【讨论】:

谢谢,但是我们可以导入实现文件而不是头文件吗?导入实现文件时出错,提示未找到。是的,我确保列出了桥接头。 hmm.. 不确定,我只知道如何使用标准桥接头访问objective-c

以上是关于从 Swift 访问 Objective-C 变量/函数的主要内容,如果未能解决你的问题,请参考以下文章

从 Objective-C 访问 Swift 扩展

项目在 Swift 中时无法从 Objective-C 访问 swift 类

从 Objective-C 向 Swift 公开一个常量变量

如何从同一个故事板访问 Objective-C 和 Swift 类?

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

从 Swift 访问 Objective-C #define 常量