web-dev-qa-db-ja.com

Swift AnyObjectはString / Intに変換できません

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)" 
} 
_

ひも用

34
pJes2

Swiftでは、StringIntはオブジェクトではありません。これが、エラーメッセージが表示される理由です。オブジェクトであるNSStringNSNumberにキャストする必要があります。これらを取得すると、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
}
40
vacawama

reminderJSON["id"]AnyObject?なので、Intにキャストできません。最初にアンラップする必要があります。

行う

self.id = reminderJSON["id"]! as Int

idがJSONに存在することが確実な場合。

if id: AnyObject = reminderJSON["id"] {
    self.id = id as Int
}

そうでなければ

5

これで、必要なのは_import foundation_だけです。 Swiftは値type(String,int)をオブジェクトtypes(NSString,NSNumber)に変換します。AnyObjectはすべてのオブジェクトで動作するため、コンパイラは不満を訴えません。

2
jishnu bala

これは実際には非常に簡単で、値は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")
}
1
Chris Conover