自从更新到最新的Xcode 6 DP3以来,我的Swift代码中出现了很多警告和错误。大多数问题已通过采用新更改的语法解决,但是出现了一个似乎很奇怪的错误。
以下代码给出了错误Type 'NSDictionary?' does not conform to protocol 'Equatable'
:
if (launchOptions != nil && launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
有没有人有办法解决吗?我可能在这里忽略了一些简单的事情。
谢谢
Beta 3中存在回归,导致Optional<T>
无法与nil
if T
not 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!")
}
但是,此替代方法可能会引起其他细微的问题(它的工作方式与_Nil
Beta 2中的类型类似,因为它引起了问题,因此将其删除了……)。
问题内容: 可以说我有两个协议: 我想要做的是为“ TheirPcol”创建一个协议扩展,该协议扩展允许在符合“ TheirPcol”的任何事物上工作。所以像这样: 关键是“ TheirPcol”,“ TheirStruct”全部由我无法控制的外部API处理。因此,我通过了实例“ inst”。 能做到吗?还是我必须做这样的事情: 问题答案: 似乎有两个用例说明为什么您想做自己正在做的事情。在第一个
问题内容: NS和非NS类之间有什么区别?特别是vs ?是否代表围绕核心非功能性的某种包装器? 问题答案: Swift 3 为现有Foundation类类型引入了一些新的 覆盖值类型 ,例如for ,for 等。完整列表和详细信息可以在下面找到 SE-0069变异性和基础价值类型 一些原因是 提供适当的值语义, 而不是可变且不可变的变体, 更多的“ Swifty” API。 新的叠加层类型应提供相
问题内容: 我正在学习快速,并试图理解字典。我已经习惯了PHP,您可能会在其中编写以下内容… 在此示例中,将按以下顺序输出值:1、2、3 我的快速代码看起来像这样… 但是,值以意外的顺序出现。我可以做些干净的事情来保持值的创建顺序,还是不能对字典进行快速排序? 问题答案: 正如已经回答的那样,词典的要点是未排序。Swift(和Objective-C)中有三种类型的集合 数组是项目的有序列表。当项目
问题内容: 什么之间的区别,以及何时该使用的呢? 例如,在Python中,如果我想打印字典,我只是,但是现在有2个其他选项。我应该如何以及何时使用它们? 问题答案: 一些区别: vs : 调试应用程序时,该功能在Xcode控制台中打印消息。 这是Swift 2中已删除且不再使用的变体。如果看到正在使用的旧代码,则可以安全地将其替换为。 回到Swift 1.x,没有在打印字符串的末尾添加换行符,而是
问题内容: 为了在使用Swift时与C API集成,我需要使用sizeof函数。在C语言中,这很容易。在Swift中,我处于类型错误的迷宫中。 我有以下代码: 第二行显示错误“’NSNumber’不是’T.Type’的子类型”。为什么会这样,我该如何解决? 问题答案: 使用sizeof如下: 使用类型作为参数。 如果您想要变量的大小,可以将该字段传递给。 像这样: 或更简单地说(由user1020
问题内容: 我一直在尝试实现单例,以用作我从网络上传到我的iOS应用的照片的缓存。我在下面的代码中附加了三个变体。我试图使版本2正常工作,但是它导致了我不理解的编译器错误,并希望就我做错的事情寻求帮助。变体1进行缓存,但我不喜欢使用全局变量。变体3并没有进行实际的缓存,我相信这是因为我在赋给var ic = ....的赋值中获得了副本,对吗? 任何反馈和见解将不胜感激。 谢谢Zvi 问题答案: 标