swift init在objective-C中不可见

时间:2014-10-20 16:47:24

标签: objective-c uitableview swift

我尝试在init中创建Swift个功能,并从Objective-C创建实例。问题是我在Project-Swift.h文件中看不到它,我在初始化时无法找到该功能。我有一个定义如下的函数:

public init(userId: Int!) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId
}

我甚至尝试过@objc(initWithUserId:)并且我再次遇到同样的错误。还有什么我想念的吗?如何让构造函数对Objective-C代码可见?

我为此阅读了以下内容:

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html

https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/interactingwithobjective-capis.html

How to write Init method in Swift

How to define optional methods in Swift protocol?

2 个答案:

答案 0 :(得分:34)

您看到的问题是Swift无法桥接可选值类型 - Int是值类型,因此Int!无法桥接。可选的引用类型(即任何类)正确桥接,因为它们在Objective-C中始终可以是nil。您的两个选项是使参数非可选,在这种情况下,它将作为intNSInteger桥接到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
}