从 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 变量/函数的主要内容,如果未能解决你的问题,请参考以下文章
项目在 Swift 中时无法从 Objective-C 访问 swift 类
从 Objective-C 向 Swift 公开一个常量变量
如何从同一个故事板访问 Objective-C 和 Swift 类?