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