Swift(beta 3)“NSDictionary? 不符合协议“可衡量”“

自从更新到最新的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中有一个回归,如果T不是EquatableComparable ,则Optional<T>不能与nil Comparable

这是一个由删除_Niltypes(为其定义相等运算符)所导致的错误。 nil现在是一个文字。 Chris Devtner在Apple Dev论坛上证实了这个错误

一些解决方法:

你仍然可以使用.getLogicValue()

 if launchOptions.getLogicValue() && ... { 

或直接

 if launchOptions && ... { //calls .getLogicValue() 

或者你可以使用“Javascript对象到布尔”解决scheme

 var bool = !!launchOptions 

(先!调用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!") } 

但是,这种解决方法可能会导致其他细微的问题(它可能_Nil Beta 2中的_Niltypes,因为它导致问题而被删除)。

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

Optionals不再符合BooleanType(以前称为LogicValue)协议,因此它们可能不再用于布尔expression式(它们必须与v!= nil明确比较)。 这解决了布尔周围的混乱? 和相关的types,使得代码更加明确地预测了什么样的testing,并且与其他语言更加一致。

请注意,ImplicitlyUnwrappedOptional仍然包含一些BooleanTypefunction。 这个问题将在未来的testing版中解决。 (17110911)!

这意味着您以前的方法现在应该没有任何问题,只需回到它:

 if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) { // some code } 

正如@Sulthan计算出的,这是Swift编译器当前beta版本中的一个bug。 但是请注意,可选项本身是一个可以testing其布尔值的LogicValue 。 所以你可以简单地写

 if launchOptions && launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] { // ... } 

没有比较nil

这为我编译,但我不知道它是否按预期工作:

 if launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] !== nil {} 

这很可能是由于在testing版3中nil变化的副作用:

•nil现在是语言中的文字,而不是_Niltypes的全局常量。 这个改变解决了一些无问题的问题; 例如,集合中的nil,nil转换为Any等。types现在可以通过符合NilLiteralConvertible协议来指示它们是无兼容的。 (16951729)

由于某种原因,它只是当它的索引字典返回一个可选的抱怨,我有一种感觉,这将是固定的未来。 尽pipe提交错误报告!