以下代码抛出一条消息,指出"条件绑定的初始化程序必须具有可选类型,而不是'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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
为解决上述错误,我使用了以下代码.
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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有比上面更好的方法或我的代码可能会崩溃?
考虑到nil check,键入check然后键入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
}
Run Code Online (Sandbox Code Playgroud)
无需打开结果try.它不是可选的.你需要将结果try转换为NSDictionary.使用as?向下转型了.
最佳实践:完全访问返回的错误以获得良好的错误处理
func parseData2(){
var data:NSData?
if let data2 = data {
do {
let details = try NSJSONSerialization.JSONObjectWithData(data2, options: .AllowFragments)
if let detailsDict = details as? NSDictionary {
print("Parse Data")
} else if let detailsArray = details as? NSArray {
print("array")
}
} catch {
print("Error \(error)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
快速而肮脏:错误处理不适合我!
func parseData2(){
var data:NSData?
if let data2 = data {
let details = try? NSJSONSerialization.JSONObjectWithData(data2, options: .AllowFragments)
if let detailsDict = details as? NSDictionary {
print("Parse Data")
} else {
print("details might be nil, or not an NSDictionary")
}
}
}
Run Code Online (Sandbox Code Playgroud)
坏屁股模式:崩溃是功能
func parseData2(){
var data:NSData?
if let data2 = data {
let details = try! NSJSONSerialization.JSONObjectWithData(data2, options: .AllowFragments) as! NSDictionary
}
}
Run Code Online (Sandbox Code Playgroud)
多个unwraps的一些额外信息:将以下代码放在操场上.
struct SomeStruct {
var anOptional : Int?
init() {
}
}
func unwrapWithIfLet() {
if let unWrappedStruct = myStruct, let unWrappedSomething = unWrappedStruct.anOptional {
print("multiple optional bindings succeeded")
// both unWrappedStruct and unWrappedSomething are available here
} else {
print("something is nil")
}
}
func unwrapWithGuard() {
guard let unWrappedStruct = myStruct, let unWrappedSomething = unWrappedStruct.anOptional else {
print("something is nil")
return
}
print("multiple optional bindings succeeded")
// both unWrappedStruct and unWrappedSomething are available here
}
var myStruct : SomeStruct?
//unwrapWithGuard()
//unwrapWithIfLet()
myStruct = SomeStruct()
myStruct!.anOptional = 1
unwrapWithGuard()
unwrapWithIfLet()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14269 次 |
| 最近记录: |