JSONをオブジェクトに解析したいのですが、AnyObjectをStringまたはIntにキャストする方法がわかりません。
_0x106bf1d07: leaq 0x33130(%rip), %rax ; "Swift dynamic cast failure"
_
たとえば、使用する場合:
_self.id = reminderJSON["id"] as Int
_
ResponseParserクラスとその中にあります(responseRemindersはAFNetworking responseObjectのAnyObjectsの配列です):
_for reminder in responseReminders {
let newReminder = Reminder(reminderJSON: reminder)
...
}
_
次に、リマインダークラスで次のように初期化します(AnyObjectとしてリマインダー、ただしDictionary(String、AnyObject)です):
_var id: Int
var receiver: String
init(reminderJSON: AnyObject) {
self.id = reminderJSON["id"] as Int
self.receiver = reminderJSON["send_reminder_to"] as String
}
_
println(reminderJSON["id"])
結果は次のとおりです。オプション(3065522)
このような場合にAnyObjectをStringまたはIntにダウンキャストするにはどうすればよいですか?
//編集
いくつかの試行の後、私はこの解決策を見つけました:
_if let id: AnyObject = reminderJSON["id"] {
self.id = Int(id as NSNumber)
}
_
intおよび
_if let tempReceiver: AnyObject = reminderJSON["send_reminder_to"] {
self.id = "\(tempReceiver)"
}
_
ひも用
Swiftでは、String
とInt
はオブジェクトではありません。これが、エラーメッセージが表示される理由です。オブジェクトであるNSString
とNSNumber
にキャストする必要があります。これらを取得すると、String
およびInt
型の変数に割り当て可能になります。
次の構文をお勧めします。
if let id = reminderJSON["id"] as? NSNumber {
// If we get here, we know "id" exists in the dictionary, and we know that we
// got the type right.
self.id = id
}
if let receiver = reminderJSON["send_reminder_to"] as? NSString {
// If we get here, we know "send_reminder_to" exists in the dictionary, and we
// know we got the type right.
self.receiver = receiver
}
reminderJSON["id"]
はAnyObject?
なので、Int
にキャストできません。最初にアンラップする必要があります。
行う
self.id = reminderJSON["id"]! as Int
id
がJSONに存在することが確実な場合。
if id: AnyObject = reminderJSON["id"] {
self.id = id as Int
}
そうでなければ
これで、必要なのは_import foundation
_だけです。 Swiftは値type(String,int)
をオブジェクトtypes(NSString,NSNumber)
に変換します。AnyObjectはすべてのオブジェクトで動作するため、コンパイラは不満を訴えません。
これは実際には非常に簡単で、値は1行で抽出、キャスト、およびアンラップできます:if let s = d["2"] as? String
、次のように:
var d:[String:AnyObject] = [String:AnyObject]()
d["s"] = NSString(string: "string")
if let s = d["s"] as? String {
println("Converted NSString to native Swift type")
}