2017-01-02 3 views
1

申し訳ありませんが、私は質問をどのようにフレーズするかについてはあまりよく分かりませんでした。だから私は問題が何であるか正確に知っている。私はいくつかのplistsから読んでいます。プレースメントリストの中には、範囲外のエラーにSwiftのヌル配列をスキップしますか?

インデックスを与える「evolved_species_id」に保存されているいかなる配列を、持っていない

は、どのように私は私のコードが持っている「evolved_species_id」のインスタンスをスキップするのですかストアドアレイはありませんか?これは私がデータを取得するために使用しているコードです。

convenience init(fromDict dict: [String:Any]) { 
    let ef = dict["evolves-from"] as? [[String:Any]] 
    let ef1 = ef?[0]["evolved_species_id"] 
    self.init(
     prevo: ef1 as? Int ?? 0, 
    ) 

} 

コンソールエラーがlet ef1 = ef?[0]["evolved_species_id"]

答えて

1

配列がを存在し、

convenience init(fromDict dict: [String:Any]) { 
    let ef1 : Int 
    if let ef = dict["evolves-from"] as? [[String:Any]], !ef.isEmpty { 
     ef1 = ef[0]["evolved_species_id"] as! Int 
    } else { 
     ef1 = 0 
    } 
    self.init(
     prevo = ef1 // the colon syntax won't compile most likely. 
    ) 
} 

空いていないか

convenience init?(fromDict dict: [String:Any]) { 

    guard let ef = dict["evolves-from"] as? [[String:Any]], !ef.isEmpty else { 
     return nil 
    } 

    self.init(
     prevo = ef[0]["evolved_species_id"] as! Int 
    ) 
} 
+0

ような何かを行うことができます。しかし、私がこれを選んだのは、 'if-let-statement'に' self.init'をラップせずに目的の結果が得られたからです。 – user4938361

+0

'if-let'が望ましいのは、複数の条件を調べることができるからです。 – vadian

0

で作成されるので、安全に配列要素をアンラップし、チェックのためにあなたがif let構文を使用することができますself.initラインになることはありませんがwhereを使用して、ゼロよりも大きくなります。

if let ef = dict["evolves-from"] as? [[String:Any]] where ef.count > 0 { 
let ef1 = ef[0]["evolved_species_id"] 
self.init(
    prevo: ef1 as? Int ?? 0, 
) 
} else { 
self.init(
    prevo: 0 
) 
} 

、あなたがスウィフト3.0

if let ef = dict["evolves-from"] as? [[String:Any]], ef.count > 0 { 
let ef1 = ef[0]["evolved_species_id"] 
    self.init(
    prevo: ef1 as? Int ?? 0, 
    ) 
} else { 
    self.init(
    prevo: 0 
    ) 
} 
0

を使用している場合は、if letだけではなくletを使用してみてください。これにより、エラーを回避できます。

0

あなたは常に配列は、それをインデックス化する前に何が含まれるかどうかを確認する必要がありfailable初期化子を使用する場合は、それをチェックすることができますインデックス外の例外を回避します。の値への安全なアクセスのための最初最後性質

init(fromDict dict: [String:Any]) 
{ 
    let ef = dict["evolves-from"] as? [[String:Any]] 
    let ef1 = ef?.first?["evolved_species_id"] 
    self.init(prevo: ef1 as? Int ?? 0) 
} 

用途:あなたはあなたがすることができます0番目のインデックス要素を取得しようとしているので、配列のfirstプロパティを使用してコードを再書き込み 配列の最初と最後の要素。配列が空の場合、これらの プロパティはゼロです。

Swift Array Reference

0

あなたは、だから私は答えのすべてを読み、彼らは基本的に同じことを言って、この

convenience init(fromDict dict: [String:Any]) { 
    let ef = dict["evolves-from"] as? [[String:Any]] 
    if !(ef.isEmpty){ /// OR if (ef.count > 0) 
     let ef1 = ef?[0]["evolved_species_id"] 
    self.init(
     prevo: ef1 as? Int ?? 0, 
    ) 
    } 
} 
関連する問題