如何将Objective-C BOOL转换为Swift的Bool,并将NSError **作为返回参数之一

时间:2017-10-08 00:57:26

标签: objective-c swift

我有一个项目,我试图将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'类型

我该怎么做才能让它发挥作用?

有人可以建议如何解决这个问题吗?

1 个答案:

答案 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抛出该错误。因此,您需要使用trycatch

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
}