比较nil并在Swift中返回一个bool

时间:2014-07-14 01:52:29

标签: swift

更新:此问题在Xcode beta5之后不再是问题

似乎beta3版本重构了“nil”如何工作,但没有足够的文档。

我有这段代码在beta2中运行良好:

func hasLogin() -> Bool {
    return self.credentail != nil
}

但在beta3中,我收到了此错误

Type 'NativeObject' does not conform to protocol 'NilLiteralConvertible'

self.credential是'Credential'协议的可选值,由NSObject子类实现

@objc
protocol Credential: NSObjectProtocol, NSCoding {

}

var credentail: Credential?

我可以通过做这样的双重否定来使它工作,但它真的看起来 ABSURD

func hasLogin() -> Bool {
    return !(!self.credentail)
}

这是Swift中的一个错误,还是我做错了什么?

3 个答案:

答案 0 :(得分:4)

Swift用于在布尔值中转换非Bool值以在if语句中使用的隐藏式方法是getLogicValue()协议的LogicValue方法(Optional实现):

func hasLogin() -> Bool {
    return self.credential.getLogicValue()
}

答案 1 :(得分:3)

这对我有用:

func hasLogin() -> Bool {
    return self.credential ? true : false
}

答案 2 :(得分:1)

XCode 6 Beta 5的发行说明如下:

  

Optionals不再符合BooleanType(以前的LogicValue)   协议,因此它们可能不再用于代替布尔值   表达式(必须与v!= nil明确比较)。这个   解决了Bool周围的困惑?和相关类型,使代码更多   明确了预期的测试,并且更符合   其余的语言。

     

请注意,ImplicitlyUnwrappedOptional仍然包含一些BooleanType   功能。这个问题将在未来的测试版中得到解决。   (17110911)!

这意味着您之前的方法应该再次运作:

func hasLogin() -> Bool {
    return self.credentail != nil
}