このスタックオーバーフローの質問では、型指定された配列にキャストすることをお勧めし[AnyObject]
ますが、私の場合、戻り値は単数AnyObject
にキャスト可能な単数JSONObjectWithData
です。
// ObjC def: public class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject
if let jsonResult = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
if let results = jsonResult!["results"] as? NSArray { // ! needed or compile error
}
}
Swift を自動的にアンラップする方法はjsonResult
?
更新: 問題を示すより良い例を次に示します。
func intOrThrow(arg: Int) throws -> AnyObject? {
if arg < 0 {
throw NSError(domain: "test", code: 400, userInfo: nil)
} else if arg == 0 {
return ["ZERO"]
} else if arg > 1000 {
return nil
}
return arg * 2
}
func strOrNil(arg: Int) -> String? {
if arg < 0 || arg > 1000 {
return nil
}
return "NUMBER\(arg)"
}
print("before intOrThrow(100) and optional unwrap")
if let x = try? self.intOrThrow(100) as? [String], // incorrect type
results = x?.count {
print("count is \(results). x is \(x)")
}
print("before intOrThrow(0) and optional unwrap")
if let x = try? self.intOrThrow(0) as? [String], // good type
results = x?.count {
print("count is \(results). x is \(x)")
}
print("before intOrThrow(-100) and optional unwrap")
if let x = try? self.intOrThrow(-100) as? [String], // throw
results = x?.count {
print("count is \(results). x is \(x)")
}
print("before intOrThrow(1111) and optional unwrap")
if let x = try? self.intOrThrow(1111) as? [String], // nil
results = x?.count {
print("count is \(results). x is \(x)")
}
print("before intOrThrow(200) and block")
if let x = try? self.intOrThrow(200) as? [String] { // incorrect type
print("count is \(x?.count). x is \(x)") // still require ! or ?, else compile error
}
print("before intOrThrow(0) and block")
if let x = try? self.intOrThrow(0) as? [String] { // good type
print("count is \(x?.count). x is \(x)") // still require ! or ?, else compile error
}
print("before intOrThrow(-200) and block")
if let x = try? self.intOrThrow(-200) as? [String] { // throw
print("count is \(x!.count). x is \(x)") // still require ! or ?, else compile error
}
print("before intOrThrow(2222) and block")
if let x = try? self.intOrThrow(2222) as? [String] { // nil
print("count is \(x?.count). x is \(x)") // still require ! or ?, else compile error
}
print("done intOrThrow")
print("before strOrNil(3333) and block")
if let x = self.strOrNil(2222) { // nil, no type cast
print("count is \(x.lowercaseString). x is \(x)") // don't require ! or ?
}
print("done strOrNil")
出力: intOrThrow(100) およびオプションの unwrap の前 intOrThrow(0) およびオプションの unwrap の前 count は 1 です。x は Optional(["ZERO"]) です。 intOrThrow(-100) およびオプションのアンラップの前 intOrThrow(1111) およびオプションの unwrap の前 intOrThrow(200) およびブロックの前 カウントはゼロです。xはゼロです intOrThrow(0) およびブロックの前 count は Optional(1) です。x は Optional(["ZERO"]) です intOrThrow(-200) およびブロックの前 intOrThrow(2222) およびブロックの前 カウントはゼロです。xはゼロです intOrThrow strOrNil(3333) およびブロックの前 行われた strOrNil