2016-11-04 2 views
0

私はGfycat APIへのネットワーク呼び出し後に保存したいデータを表すGfycat構造体を持っています。引数として:[任意の文字列] Gfycat構造体への拡張で 辞書からアクセスするときにAny型のオブジェクトをInt型に降格できません

typealias JSONDictionary = [String: Any] 

struct Gfycat { 
    let id: String 
    let number: Int 
} 

は、私は種類の辞書を取るfailable初期化子を書きました。この辞書を使用して、構造体のプロパティに値を割り当てます。

extension Gfycat { 
    init?(dictionary: JSONDictionary) { 
     guard let id = dictionary["gfyId"] as? String, 
      let number = dictionary["gfyNumber"] as? Int { return nil } 
     self.id = id 
     self.number = number 
    } 
} 

問題が辞書から値にアクセスするとき、私はintに任意の値をダウンキャストすることができないということです。これは私が書いたオリジナルのinitメソッドです。最初にAnyをStringにダウンカストしてから、その文字列をIntに変換する必要があります。これはバグか、私が理解していないSwiftの機能ですか?私は最初のIntにその文字列を変換し、その後、Stringにどれをダウンキャストする必要があります

extension Gfycat { 
    init?(dictionary: JSONDictionary) { 
     guard let id = dictionary["gfyId"] as? String, 
      let uncastedNumber = dictionary["gfyNumber"] as? String, 
      let number = Int(uncastedNumber) else { return nil } 
     self.id = id 
     self.number = number 
    } 
} 
+0

これは、辞書が文字列でキーされていて、値がintではなく文字列であることを意味します。 – rmaddy

+0

JSONとは何ですか? JSONの文字列が数字(例えば1.0ではなく1.0)になっている場合、これは正しい動作です。その適切な文字列と数値への明示的な変換が必要です。 –

答えて

1

これが私の解決策でした。これはバグか、私が理解していないSwiftの機能ですか?

これはSwiftのバグでも機能でもありません。これは、あなたが作業している辞書についての事実です。この物はです。です。だからあなたはそれをIntにキャストすることはできません。

+0

ええ、私は今それを得る。ありがとう。私はもう少し目を覚ます必要があった。 -_- –

+0

@mattこんにちは、データを取得する場合、ネットワークからの辞書で、辞書のキーと値は文字列値でなければなりません。値は 'Int'か他の型の値ですか? – aircraft

関連する問題