一尘不染

在目标C中不可见的快速初始化

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


阅读 195

收藏
2020-07-07

共1个答案

一尘不染

您看到的问题是,Swift无法桥接可选值类型-这Int是一种值类型,因此
Int!无法桥接。可选引用类型(即任何类)都可以正确桥接,因为它们始终可以nil在Objective-
C中使用。您的两个选择是使参数成为非可选参数,在这种情况下,它将作为int或桥接到ObjC NSInteger

// 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也是可选参数,否则您将自己设置为可能会导致运行时崩溃。

2020-07-07