【问题标题】:Accessing Objective-C variables/functions from Swift从 Swift 访问 Objective-C 变量/函数
【发布时间】: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'
    }

}

可以这样做吗?谢谢。

【问题讨论】:

    标签: objective-c swift import bridging-header


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多