我尝试在init
中创建Swift
个功能,并从Objective-C
创建实例。问题是我在Project-Swift.h
文件中看不到它,我在初始化时无法找到该功能。我有一个定义如下的函数:
public init(userId: Int!) {
self.init(style: UITableViewStyle.Plain)
self.userId = userId
}
我甚至尝试过@objc(initWithUserId:)
并且我再次遇到同样的错误。还有什么我想念的吗?如何让构造函数对Objective-C
代码可见?
我为此阅读了以下内容:
答案 0 :(得分:34)
您看到的问题是Swift无法桥接可选值类型 - Int
是值类型,因此Int!
无法桥接。可选的引用类型(即任何类)正确桥接,因为它们在Objective-C中始终可以是nil
。您的两个选项是使参数非可选,在这种情况下,它将作为int
或NSInteger
桥接到ObjC:
// Swift
public init(userId: Int) {
self.init(style: UITableViewStyle.Plain)
self.userId = userId
}
// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: 10];
或者使用可选的NSNumber?
,因为它可以作为可选值桥接:
// Swift
public init(userId: NSNumber?) {
self.init(style: UITableViewStyle.Plain)
self.userId = userId?.integerValue
}
// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: @10]; // note the @-literal
但是,请注意,您实际上并没有将参数视为可选参数 - 除非self.userId
也是可选项,否则您可能会以这种方式设置潜在的运行时崩溃。
答案 1 :(得分:0)
使用这个:
var index: NSInteger!
@objc convenience init(index: NSInteger) {
self.init()
self.index = index
}