【发布时间】:2016-04-04 15:57:01
【问题描述】:
以下 swift 代码 sn-p 在为模拟器构建时可以正确编译,但如果我选择我的 iPhone 4 设备 (iOS 9.3.1) XCode 会报错:
if let result = (jsonobj["user"] ?? jsonobj["users"]!) {
if let item = result["userID"] as Int {
self.userID = item
}
}
错误指向第二行上的“结果”变量,并显示“可选类型 'AnyObject?' 的值?”没有打开;你是不是要使用“!”还是‘?’?”
这个错误没有意义,因为'result'在第一行被展开。此外,升级到 XCode 7.3 之前也没有问题。如前所述,如果我切换到为模拟器构建,错误就会消失。
我应该将此作为错误发布吗?有人有什么见解吗?
更新
当我第一次遇到这个问题时,设备没有更新到最新的 iOS 版本 (9.3.1)。我试图进行编译器建议的更改;这允许代码构建,但在选择模拟器进行构建时引入了错误。另外,当我在设备上运行代码时,代码莫名其妙地崩溃了。
我随后将设备更新到 9.3.1,现在编辑后的代码运行时不会崩溃,这使我能够继续开发,但没有解释与模拟器的区别。
接下来我创建了一个新项目并将错误代码复制到 AppDelegate.swift 文件中;该错误再次出现,但是,它也出现在模拟器构建中。进行建议的更改可以解决这两种情况下的问题。
我将继续检查两个项目的构建设置,看看是否有更具体的原因导致设备和模拟器之间的行为差异。
【问题讨论】:
-
正确的可选绑定语法是
if let item = result["userID"] as? Int {} -
@vadian 仅当 result["userID"] 不是 Int 时?
-
@user3441734 我不明白。此可选绑定语法意味着仅当
result中的键userID存在且类型为Int时才设置self.userID。默认情况下,字典键的值始终为AnyObject?,除非字典被声明得更具体。 -
@vadian if result 的类型为 [String:Int] .... 而不是看我的答案 // (3)
-
@user3441734 JSON
user字典不太可能是[String:Int],即使是,在这种特殊情况下编译器也不知道。