更新:此问题在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中的一个错误,还是我做错了什么?
答案 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
}