2017-01-02 4 views
1

Entschuldigung, ich war mir nicht ganz sicher, wie ich die Frage formulieren sollte. Also ich weiß genau, was das Problem ist. Ich lese von mehreren Seiten. Einige der plists haben keine Array gespeichert in „evolved_species_id“, die den FehlerÜberspringe Null-Arrays in Swift?

Index außerhalb des zulässigen Bereichs

Wie bekomme ich meinen Code überspringen über die Instanzen von „evolved_species_id“ gibt, die haben kein gespeichertes Array? Dies ist der Code, mit dem ich die Daten erhalte.

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, 
    ) 

} 

Es ist nie auf die self.init Linie bekommt, da die Konsole Fehler bei let ef1 = ef?[0]["evolved_species_id"]

Antwort

1

Sie können überprüfen, ob das Array existiert und nicht leer

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. 
    ) 
} 

oder verwenden Sie eine failable initializer

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

So wie diese etwas tun, las ich alle Antworten durch und sie sagen, im Wesentlichen das Gleiche. Der Grund, warum ich diesen gewählt habe, ist, weil er das gewünschte Ergebnis erzielt, ohne das 'self.init' in die 'if-let-Anweisung' zu bringen. – user4938361

+0

' wenn - lassen' ist vorzuziehen, weil Sie nach mehreren Bedingungen suchen können. – vadian

0

erstellt wird, kann Sie if let Konstrukt verwenden für sicher auspacken und Array-Elemente prüfen größer als Null ist where verwenden.

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

und wenn Sie Swift 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 
    ) 
} 
mit
0

Versuchen if let statt nur let verwenden. Dies kann den Fehler vermeiden.

0

Sie sollten immer prüfen, ob das Array alles enthält, bevor es die Indizierung, es vermeidet Index außerhalb der gebundenen Ausnahmen. Da Sie versuchen, den 0-ten Indexelement erhalten können Sie Ihren Code mit first Eigenschaft Array neu schreiben:

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

Verwenden Sie die ersten und letzten Eigenschaften für den sicheren Zugriff auf den Wert des Array erste und letzte Elemente. Wenn das Array leer ist, sind diese Eigenschaften Null.

Swift Array Reference

0

Sie können

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, 
    ) 
    } 
} 
Verwandte Themen