一尘不染

斯威夫特(测试版3)“ NSDictionary?不符合协议“平等””

swift

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

以下代码给出了错误Type 'NSDictionary?' does not conform to protocol 'Equatable'

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

有没有人有办法解决吗?我可能在这里忽略了一些简单的事情。

谢谢


阅读 196

收藏
2020-07-07

共1个答案

一尘不染

Beta 3中存在回归,导致Optional<T>无法与nilif Tnot Equatable或进行比较Comparable

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

一些解决方法:

您仍然可以使用 .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!")
}

但是,此替代方法可能会引起其他细微的问题(它的工作方式与_NilBeta 2中的类型类似,因为它引起了问题,因此将其删除了……)。

2020-07-07