我已经阅读了多本有关如何在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];
但是我收到错误消息,它是一个未声明的标识符。
我是使用正确的方法还是有另一种方法?
答案 0 :(得分:2)
您需要通过在类的前面加上@objc
尝试
@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”。第一次将快速文件添加到项目中是此提示出现的唯一时间。立即选择“创建桥头”将为您省去手动创建桥头的麻烦。
参考: 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部分“未知类型名称”中得到错误