2017-10-26 9 views
0

Swiftで解析したJSON応答が[String:Any]という1つの辞書セットになっています。私はそれが値のために各キーをチェックしようとしている、そしてSteamFriendオブジェクトの作成に渡された変数としてその値を追加します。辞書キーから値を抽出してオブジェクトに結合する

for (key, value) in level3 { 
    var avatar:URL! 
    var personaname:String = "" 
    var personastate:Int = 0 
    var steamid:String = "" 

    if key == "avatar" { 
     if let avatarAsString = value as? String { 
      let avatarAsURL = URL(string: avatarAsString) 
      avatar = avatarAsURL 
     } 
    } else if key == "personaname" { 
     if let personanameAsString = value as? String { 
      personaname = personanameAsString 
     } 
    } else if key == "personastate" { 
     if let personastateAsInt = value as? Int { 
      personastate = personastateAsInt 
     } 
    } else if key == "steamid" { 
     if let steamidAsString = value as? String { 
      steamid = steamidAsString 
     } 
    } 

    let createSteamFriend = SteamFriend(avatar: avatar, personaname: 
    personaname, personastate: personastate, steamid: steamid) 
} 

と私はすぐに「オブジェクトをアンラップしながら、予想外にnilを見つけ、」旨createSteamFriendライン上のエラーを取得し、上記のコードを実行するとSteamFriendためのクラスが

class SteamFriend { 
var avatar: URL 
var personaname: String 
var personastate: Int 
var steamid: String 

init (avatar:URL, personaname:String, personastate: Int, steamid:String) { 
    self.avatar = avatar 
    self.personaname = personaname 
    self.personastate = personastate 
    self.steamid = steamid 
} 

}

です。私は上の各オプションのキャストに対してprintステートメントを実行しました。そして、それらがすべて戻り値であることを知っています。

私のコードのロジックに欠陥があると確信しています。 SteamFriendオブジェクトを作成する適切な方法を理解することができません。

+0

'let createSteamFriend = SteamFriend(...)'行にブレークポイントを置き、値を確認してください。また、私はあなたがループの外側(後)にその行をし、var宣言を外側に置くことを望むと思います(foorループの前)。 'SteamFriend(avatar:personaname:personastate:steamid:)'のコードは何ですか? – Larme

+0

@larme SteamFriendクラスを含むように今すぐ答えを更新します。 –

答えて

1

問題は、URLがnilあるので、キーavatarが最後の繰り返しで発見されない限り、あなたが各ループ内の変数を再宣言ということです。

とにかく、これは単なるループせずに直接キーの値を取得し、辞書を列挙することは非常に面倒な方法です:

var avatar: URL! 

if let avatarAsString = level3["avatar"] as? String { 
    let avatarAsURL = URL(string: avatarAsString) 
    avatar = avatarAsURL 
} 
let personaname = level3["personaname"] as? String ?? "" 
let personastate = level3["personastate"] as? Int ?? 0 
let steamid = level3["steamid"] as? String ? "" 

let createSteamFriend = SteamFriend(avatar: avatar, personaname: 
personaname, personastate: personastate, steamid: steamid) 

初期化子でavatarパラメータが必要な場合(非オプションタイプ)私も、あなたは4時間と値が一度に単独で来るcreateSteamFriendインスタンスを作成しているので、あなたのavatarがnilである、基本的に

guard let avatarAsString = level3["avatar"] as? String else { 
    // show an error message 
    return 
} 
let avatar = URL(string: avatarAsString)! 
+0

これはありがとうございました。私はループのためにあまりにも多くをやっていた。あなたがこれを述べた後、私は直ちにレベル3のプリントを行い、最後のforループは不要であることがわかりました。 –

0

各要素のループ内の変数をリセットしています。 「アバター」を見つけたら、URLを設定します。次の要素、アバターをURLにリセットしました! 変数を置き、createSteamFriendをループ外にします。

var avatar:URL! 
var personaname:String = "" 
var personastate:Int = 0 
var steamid:String = "" 

for (key, value) in level3 { 

if key == "avatar" { 
    if let avatarAsString = value as? String { 
     let avatarAsURL = URL(string: avatarAsString) 
     avatar = avatarAsURL 
    } 
} else if key == "personaname" { 
    if let personanameAsString = value as? String { 
     personaname = personanameAsString 
    } 
} else if key == "personastate" { 
    if let personastateAsInt = value as? Int { 
     personastate = personastateAsInt 
    } 
} else if key == "steamid" { 
    if let steamidAsString = value as? String { 
     steamid = steamidAsString 
    } 
} 

} 
let createSteamFriend = SteamFriend(avatar: avatar, personaname: 
personaname, personastate: personastate, steamid: steamid) 
0

を記述します。

単一の辞書を取得すると、なぜループを実行しますか?ディクショナリから値を直接取得してみてください。ループを使用しないでください。

var avatar = URL() 

if let avatarAsString = level3["avatar"] as? String { 
    let avatarAsURL = URL(string: avatarAsString) 
    avatar = avatarAsURL 
} 
let personaname = level3["personaname"] as? String 
let personastate = level3["personastate"] as? Int 
let steamid = level3["steamid"] as? String 

let createSteamFriend = SteamFriend(avatar: avatar, personaname: 
      personaname, personastate: personastate, steamid: steamid) 
関連する問題