我有一个项目,我试图将Swift用于新模块。对于其中一个新类,我在Swift 3.2中使用了Objective-C类的现有方法。
以下是该方法的签名,
- (BOOL)canLoginWithUsername:(NSString *)username password:(NSString *)password error:(NSError **)error
我试图在swift中使用这个方法,
if try loginLogicHandler.canLogin(withUsername: usernameValue, password: passwordValue) as Bool {
}
但是,我收到编译错误
无法将type()的值转换为强制
中的'Bool'类型
我该怎么做才能让它发挥作用?
有人可以建议如何解决这个问题吗?
答案 0 :(得分:4)
返回BOOL
并通过引用返回NSError
的Objective-C方法作为使用try
/ catch
错误处理机制的方法暴露给Swift,返回Void
。如果你看一下生成的界面,你可能会看到它看起来像这样:
func canLogin(withUsername: String, password: String) throws // notice no return type
如果Objective-C方法失败,则返回NO
,并填充错误指针,然后Swift抛出该错误。因此,您需要使用try
和catch
:
do {
try loginLogicHandler.canLogin(with: bla, and: bla)
// if canLogin returned YES, you get here
} catch {
// if canLogin returned NO, you get here
}
或者,您可以使用try?
。这个有点奇怪;您将获得一个可选的Void
,因此如果方法成功,您将获得Void
,如果失败则获得nil
:
if (try? loginLogicHandler.canLogin(with: bla, and: bla)) != nil {
// the method returned YES
}