类是用Swift写的,
@objc class Test: NSObject {
@objc func testBoolean() -> Bool {
return true
}
@objc func testOptionalBoolean() -> Bool? {
return true
}
@objc func testThrowableBoolean() throws -> Bool {
return true
}
@objc func testThrowableOptionalBoolean() throws -> Bool? {
return true
}
}
在这些函数中,只有第一个函数是可编译的。
其他函数编译器错误,
testOptionalBoolean:方法不能标记为@objc,因为它的结果类型不能用Objective表示。 testThrowableBoolean:抛出方法不能标记为@objc,因为它返回‘Bool’类型的值;返回'Void‘或连接到目标-C类的类型。 testThrowableOptionalBoolean:方法不能标记为@objc,因为它的结果类型不能用Objective表示。
使所有函数对objc调用者可用的正确方法是什么?
发布于 2020-03-10 00:08:15
错误信息非常清楚:
nullable
。throw
ing Swift函数转换为ObjC inout NSError
语法,返回类型必须是AnyObject
(类)。例如,可以将Bool
类型替换为NSNumber
。
@objc func testOptionalBoolean() -> NSNumber? {
return true // Yes, returning a Swift Bool is valid
}
但是,即使使用NSNumber
,函数testThrowableOptionalBoolean
也不会编译,因为抛出函数的设计是在成功时返回一个非可选函数。
发布于 2020-03-10 00:24:27
硒-0230修改了
try?
的工作方式,从而使嵌套选项变平,成为常规选项。这使得它的工作方式与可选链接和条件类型转换相同,在早期的Swift版本中,这两种类型都是扁平的选项。
您可以创建一个对象作为包装器。
@objc class Test: NSObject {
@objc func testBoolean() -> Bool {
return true
}
@objc func testOptionalBoolean() -> BooleanWrapper? {
return BooleanWrapper(true)
}
@objc func testThrowableBoolean() throws -> BooleanWrapper {
return BooleanWrapper(true)
}
}
使用
if let wrapper = try? test.testThrowableBoolean() {
print(wrapper.bool)
}
包装器
@objc class BooleanWrapper: NSObject {
let bool: Bool
init(_ bool: Bool) {
self.bool = bool
}
}
https://stackoverflow.com/questions/60612487
复制