自从更新到最新的Xcode 6 DP3以来,我的Swift代码中出现了很多警告和错误。大多数问题已通过采用新更改的语法解决,但是出现了一个似乎很奇怪的错误。
以下代码给出了错误Type 'NSDictionary?' does not conform to protocol 'Equatable':
Type 'NSDictionary?' does not conform to protocol 'Equatable'
if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
有没有人有办法解决吗?我可能在这里忽略了一些简单的事情。
谢谢
Beta 3中存在回归,导致Optional<T>无法与nilif Tnot Equatable或进行比较Comparable。
Optional<T>
nil
T
Equatable
Comparable
这是由于删除了_Nil定义了相等运算符的类型而导致的错误。nil现在是一个文字。该漏洞已由Chris Lattner在Apple Dev论坛上确认。
_Nil
一些解决方法:
您仍然可以使用 .getLogicValue()
.getLogicValue()
if launchOptions.getLogicValue() && ... {
或直接
if launchOptions && ... { //calls .getLogicValue()
或者,您也可以使用“将Javascript对象布尔化”解决方案
var bool = !!launchOptions
(第一个!调用getLogicValue和取反,第二个!再次取反)
!
getLogicValue
或者,您可以自己定义这些相等运算符,直到他们解决它:
//this is just a handy struct that will accept a nil literal struct FixNil : NilLiteralConvertible { static func convertFromNilLiteral() -> FixNil { return FixNil() } } //define all equality combinations func == <T>(lhs: Optional<T>, rhs: FixNil) -> Bool { return !lhs.getLogicValue() } func != <T>(lhs: Optional<T>, rhs: FixNil) -> Bool { return lhs.getLogicValue() } func == <T>(lhs: FixNil, rhs: Optional<T>) -> Bool { return !rhs.getLogicValue() } func != <T>(lhs: FixNil, rhs: Optional<T>) -> Bool { return rhs.getLogicValue() }
例:
class A { } var x: A? = nil if x == nil { println("It's nil!") } else { println("It's not nil!") }
但是,此替代方法可能会引起其他细微的问题(它的工作方式与_NilBeta 2中的类型类似,因为它引起了问题,因此将其删除了……)。