我希望在Swift中有一个函数可以返回一个
例如:
这个函数在Swift中可以正常工作,但是如果我试图从Objective-C中使用这个函数,编译器无法找到该方法。我知道
Bool
,但如果出现异常,则也可以throw
。例如:
func doSomething(value: Int) throws -> Bool {
if (value > 0) {
return true
} else if (value == 0) {
throw NSError(domain: "SwiftClass", code: 0, userInfo: nil)
}
return false
}
这个函数在Swift中可以正常工作,但是如果我试图从Objective-C中使用这个函数,编译器无法找到该方法。我知道
throws
需要将Objective-C函数签名更改为doSomething:x error:&error
,并且如果我将返回类型更改为Void
,它就可以工作了。func doSomething(value: Int) throws -> Void {
if (value == 0) {
throw NSError(domain: "SwiftClass", code: 0, userInfo: nil)
} else if (value < 0) {
throw NSError(domain: "SwiftClass", code: -1, userInfo: nil)
}
}
但这有不同的语义。在第一个示例中,只需要处理异常(或非零NSError
)如果有问题。使用此代码,我必须捕获异常(或检查错误)并确定它是否是真正的问题还是有效的“false”情况。
在Objective-C上下文中是否真的无法使用具有非void返回并引发异常的Swift函数?
throw
后面加上return
可以吗?在Swift中,如果一个方法抛出异常,它不会返回任何东西。在Objective-C中,设置错误参数并不能让你避免返回有效值。 - nhgrifdoSomething
方法具有非 void 返回,则该方法简单地不会出现在-Swift.h
文件中。 - Paulw11void
,Objective-C方法将返回BOOL
(并添加错误参数)(这对我来说只有那么多意义)。但是没有明确说明当有非void
返回时我们是否应该期望它能正常工作。 - nhgrif@objc
给了我更多信息——一个错误——“抛出方法不能被标记为@objc,因为它返回类型为'Bool'; 返回'Void'或桥接到Objective-C类的类型”。将返回类型更改为NSNumber
让我可以从Objective-C调用该函数,这很奇怪,因为我认为Swift会自动将Bools打包成NSNumber。如果该方法不抛出异常,则可以愉快地将布尔值返回给Objective-C。 - Paulw11