2017-04-05 7 views
0
let allPlaces = resultsArray.map({ (param) -> Places in 
         return Places(dictionary: param) 
        }) 
        print("All Places \(allPlaces[0].placeName)") 

Die Ausgabe des obigen Codes ist:Swift NSObject Eigenschaft ist nicht optional, aber er druckt optional

Alle Orte Optional ("U-Bahn")

Im folgenden Code der var ist nicht optional. Aber die print-Anweisung gibt es als Optional aus. Sollte es nicht drucken All Places "Subway"?

class Places: NSObject { 


    var name:String! 


    init(dictionary:Dictionary<String, Any>) { 

     name = dictionary["name"] as? String 
    } 
} 
+0

Von diesem Ort Wörterbuch ["Name"] als? String gibt es optional. Ändern Sie es in Wörterbuch ["Name"] als! String gibt Ihnen nicht-optional –

+0

Versuchen Sie diese 'print (" Alle Orte "+ allPlaces [0] .placeName)' –

+0

'Wörterbuch [" name "] als? String' macht es zu einem optionalen Wert. – byJeevan

Antwort

0

es ändern zu

class Places: NSObject { 


     var name:String! 


     init(dictionary:Dictionary<String, Any>) { 

      name = dictionary["name"] as! String 
     } 

} 
0

Change 'wie?' zu "wie!".

  • Das Ausrufezeichen bedeutet, dass es absolut klar ist.

  • Das Fragezeichen bedeutet optionale Bindung.

[Quelle]

class Places: NSObject { 


    var name:String! 


    init(dictionary:Dictionary<String, Any>) { 

     name = dictionary["name"] as! String 

    } 
} 

Ein anderer Weg

print("All Places \(allPlaces[0].placeName)") 

zu

print("All Places \(allPlaces[0].placeName!)") 

or 

print("All Places \(allPlaces[0].placeName ?? "")") 
+1

Was ist der Unterschied zwischen unten Antwort @theodore cha –

+0

Was ist, wenn "Name" Schlüssel nicht verfügbar ist? – andyPaul

+0

@andyPaul ich denke .. benutze Doppel Fragezeichen (Standardwert) // Name = Wörterbuch ["Name"] als? Schnur ?? "" –

0
var name:String! 

Sie haben den Namen implizit als optional deklariert deklariert. Von Swift 3 wird es nur dann ausgepackt, wenn sie vor Ort typgeprüft werden müssen. Ansonsten wird es nur als normal betrachtet.

print("All Places \(allPlaces[0].name)") 

Hier ist keine Typprüfung beteiligt, daher wäre der Name noch Optional.

Wenn Sie das tun, wie

let name:String = allPlaces[0].name 
print("All Places \(name)") 

Ausgang wird „Alle Orte der U-Bahn“

oder was Sie brauchen auspacken zu zwingen, es

print("All Places \(allPlaces[0].name!)") 

Dieser Absturz verursachen würde, wenn die name Null ist du solltest dich darum kümmern. Wenn es eine Chance gibt, dass der Name null sein kann, dann benutze var name: String?, so dass der Compiler dich zwingt, explizit auszupacken.