【发布时间】:2016-01-27 15:58:53
【问题描述】:
下面的代码会抛出一条消息,上面写着“条件绑定的初始化程序必须具有可选类型,而不是 'AnyObject'”
func parseData2(){
var data:NSData?
if let data2 = data {
do {
let details = try NSJSONSerialization.JSONObjectWithData(data2, options: .AllowFragments)
if let actualDetails = details where actualDetails.isKindOfClass(NSDictionary) {
print("Parse Data")
}
}catch {
print("Error \(error)")
}
}
}
为了解决上述错误,我使用了以下代码。
func parseData2(){
var data:NSData?
if let data2 = data {
do {
let details:AnyObject = try NSJSONSerialization.JSONObjectWithData(data2, options: .AllowFragments)
if let actualDetails:AnyObject = details where actualDetails.isKindOfClass(NSDictionary) {
print("Parse Data")
}
}catch {
print("Error \(error)")
}
}
}
有没有比上述更好的方法,否则我的代码可能会崩溃?
考虑到 nil check、type check 和 type cast check,我想再添加一个代码。 Swift 提供了极大的灵活性但很难解决问题的原因。假设我有一本字典,cityDetails,我正在尝试获取 self.cityZipCode 和 self.cityIdentifier 的数据,它们是可选的,定义为 var cityZipCode:Int?和 var cityIdentifier:Int?
if let cityBasic = cityDetails["basicDetails"] where
cityBasic!.isKindOfClass(NSDictionary) {
self.cityZipCode = (cityBasic as! NSDictionary)["zip"].integerValue ?? 0
self.cityIdentifier = (cityBasic as! NSDictionary)["cityId"].integerValue ?? 0
}
【问题讨论】:
-
我不明白您在更新问题时要问什么?要么澄清它与第一部分的关系,要么为新部分提出一个新问题。目前您的标题涉及
Optional Binding问题,您的第一部分是关于do try catch,现在是关于down casting和nil coalescing operator -
我对 nil check ,类型检查然后向下转换有点困惑,所有这些东西如何协同工作?简单的代码,但需要大量的理解。
-
is and as、optional binding、do try catch。谷歌是一般语言问题的朋友。特别是当它涉及到最多的东西时
-
nil 检查是一个简单的 if else 取决于 nil/值。可选绑定为您提供来自可选输入的非可选结果。类型检查是一个简单的 if else 取决于类型。向下转换为您提供特定类型的可选结果。
-
您有机会查看这些链接吗?