ios – Swift(beta 3)“NSDictionary?不符合协议’Equatable’“

自从更新到最新的Xcode 6 DP3以来,我在Swift代码中遇到了一些警告和错误.大多数已通过采用新更改的语法解决,但有一个错误似乎很奇怪.

以下代码给出错误类型’NSDictionary?’不符合协议’Equatable’:

if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {

有没有人有办法解决吗?我可能在这里忽略了一些简单的东西..!

谢谢

Beta 3中存在回归,导致可选< T>.如果T不是Equatable或Comparable,则无法与nil进行比较.

这是由于删除了定义了相等运算符的_Nil类型而导致的错误.现在是一个文字.该错误已由Chris Lattner于Apple Dev Forums确认

一些解决方法:

你仍然可以使用.getLogicValue()

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

或直接

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

或者您可以使用“Javascript对象布尔”解决方案

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!")
}

但是,这种解决方法可能会导致其他微妙的问题(它可能与Beta 2中的_Nil类型相似,因为它导致了问题而被删除了……).

https://stackoverflow.com/questions/24638964/swift-beta-3-nsdictionary-does-not-conform-to-protocol-equatable

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ios – Swift(beta 3)“NSDictionary?不符合协议’Equatable’“