自从更新到最新的Xcode 6 DP3后,我的Swift代码中出现了一些警告和错误。大多数已通过采用新更改的语法解决,但有一个错误似乎很奇怪。
以下代码提供错误Type 'NSDictionary?' does not conform to protocol 'Equatable'
:
if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
有没有人有解决方案?我可能在这里忽略了一些简单的事情......!
由于
答案 0 :(得分:8)
如果Optional<T>
不是nil
或T
,则Beta 3中存在回归导致Equatable
无法与Comparable
进行比较。
这是由删除定义了相等运算符的_Nil
类型引起的错误。 nil
现在是文字。该问题已由Chris Lattner在Apple Dev Forums
一些解决方法:
您仍然可以使用.getLogicValue()
if launchOptions.getLogicValue() && ... {
或直接
if launchOptions && ... { //calls .getLogicValue()
或者你可以使用&#34; Javascript对象来布尔&#34;溶液
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
类型相似,因为它导致了问题而被删除了。)。
答案 1 :(得分:4)
XCode 6 Beta 5的发行说明如下:
Optionals不再符合BooleanType(以前的LogicValue) 协议,因此它们可能不再用于代替布尔值 表达式(必须与v!= nil明确比较)。这个 解决了Bool周围的困惑?和相关类型,使代码更多 明确了预期的测试,并且更符合 其余的语言。
请注意,ImplicitlyUnwrappedOptional仍然包含一些BooleanType 功能。这个问题将在未来的测试版中得到解决。 (17110911)!
这意味着您之前的方法现在应该没有任何问题,只需返回它:
if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
// some code
}
答案 2 :(得分:2)
正如@Sulthan所知,这是Swift编译器当前测试版中的一个错误。
但请注意,可选项本身是LogicValue
,可以对其进行测试
布尔值。所以你可以简单地写
if launchOptions && launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] {
// ...
}
而不与nil
进行比较。
答案 3 :(得分:0)
这为我编译,但我不确定它是否按预期工作:
if launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] !== nil {}
这很可能是nil
更改为测试版3中文字的副作用:
•nil现在是语言中的文字,而不是_Nil的全局常量 类型。这个改变解决了nil的一些问题;例如零 在集合中,nil转换为Any等。现在可以指示类型 通过符合它们它们是零兼容的 NilLiteralConvertible协议。 (16951729)
出于某种原因,它只是在从索引字典返回一个可选项时抱怨,我觉得这将在以后修复。提交错误报告!