为什么我不能在我的Objective-C代码中使用swift文件?

时间:2019-10-04 09:05:25

标签: ios objective-c swift

我已经阅读了多本有关如何在swift中使用classes objective-c classes的教程,这看起来很简单,但是我仍然无法使用它。

我有一个名为UserDefaultsFactory.swift的swift测试类,其中包含以下内容:

class UserDefaultFactory {
    func a() {
        print("?HELLO")
    }
}

在我的objective-c class中,我像这样导入了项目名称交换:#import "NetPBXMobile-Swift.h"。这项工作没有任何错误,如果我访问文件,我可以看到它已包含对swift类的引用。但是由于某种原因,它不包含我自己的class UserDefaultsFactory

我已经清理并构建了代码,但是什么也没有。据我了解,NetPBXMobile-Swift.h是自动创建的,据我所知,它包含了我先前创建的其他classes的迅捷功能。

我尝试过初始化这样的对象:

UserDefaultFactory a = [[UserDefaultFactory alloc] init];

但是我收到错误消息,它是一个未声明的标识符。

我是使用正确的方法还是有另一种方法?

4 个答案:

答案 0 :(得分:2)

您需要通过在类的前面加上@objc

来标记该类可用于Objective-c。

尝试

@objc class UserDefaultFactory: NSObject {
    func a() {
        print("?HELLO")
    }
} 

答案 1 :(得分:2)

为了澄清...您的班级必须标记为@objc,并且必须来自NSObject ,您的func必须也标记为@objc

@objc class UserDefaultFactory: NSObject {
    @objc func a() {
        print("?HELLO")
    }
}

然后从Objective-C代码中调用该函数:

UserDefaultFactory *udf = [UserDefaultFactory new];
[udf a];

可以也可以通过以下方式调用它:

[[UserDefaultFactory new] a];

但是很有可能您将创建UserDefaultFactory对象的实例以用于其他用途。

答案 2 :(得分:1)

将新的Swift文件添加到项目中。在菜单中,选择文件>新建>文件…,然后选择Swift文件,而不是Cocoa Touch Class。命名文件并点击创建。 将出现一个对话框,请确保在出现提示时选择“ Create Bridging Header”。第一次将快速文件添加到项目中是此提示出现的唯一时间。立即选择“创建桥头”将为您省去手动创建桥头的麻烦。

  1. 接下来,在选择“创建桥接标题”或手动创建之后,进入项目的常规设置。选择适合您应用的目标。转到“ Build Settings”,然后切换到“ All”,而不是默认的“ Basic”。在这里搜索“包装”部分。通过将“否”更改为“是”,打开“定义模块”。

参考: https://medium.com/ios-os-x-development/swift-and-objective-c-interoperability-2add8e6d6887

答案 3 :(得分:1)

确保您的Swift类继承自NSObject(直接或间接)派生​​的类。

将您的Swift类标记为@objc,而没有上面描述的任何继承-您将收到错误消息“只能声明从NSObject继承的类@objc”

将您的Swift类标记为@objcMembers,而没有任何继承-您将在Obj-c部分“未知类型名称”中得到错误