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
不是Equatable
或Comparable
,则Optional<T>
不能与nil
Comparable
。
这是一个由删除_Nil
types(为其定义相等运算符)所导致的错误。 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中的_Nil
types,因为它导致问题而被删除)。
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提交错误报告!