3
名前配列がデコードされないのはなぜですか?コード可能/デコード可能な文字列で配列をデコードする必要があります
あなたはCountry
のオプションプロパティとしてnames
を定義しているあなたの遊び場
import Foundation
struct Country : Decodable {
enum CodingKeys : String, CodingKey {
case names
}
var names : [String]?
}
extension Country {
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
names = try values.decode([String]?.self, forKey: .names)!
}
}
let json = """
[{
"names":
[
"Andorre",
"Andorra",
"アンドラ"
]
},{
"names":
[
"United Arab Emirates",
"Vereinigte Arabische Emirate",
"Émirats Arabes Unis",
"Emiratos Árabes Unidos",
"アラブ首長国連邦",
"Verenigde Arabische Emiraten"
]
}]
""".data(using: .utf8)!
let decoder = JSONDecoder()
do {
let countries = try decoder.decode([Country].self, from: json)
countries.forEach { print($0) }
} catch {
print("error")
}
この作品をクール!しかし、それを 'Dictionary'のために解決する方法。私は 'translations = try values.decodeIfPresent(Dictionary .self、forKey:.translations) 'を試しましたが、これは '操作を完了できませんでした。 (Swift.DecodingErrorエラー1.) '。これに対しても解決策はありますか? –
Jan
@Jan:私が知っている限り(しかし、私は100%確信していません)、JSONから任意の*辞書をデコードすることはできません。もちろんキーが固定されている場合は、それらのキーをプロパティとして持つ型を定義することができます: 'struct Translations:Decodable {var en:String?; var de:String?; ...} ' –
私はDictsと協力しています:' var translations:[String:String?]? (文字列:String?)。自己、forKey:.translations) ' 'と 'translations = try values.decodeIfPresent – Jan