2014-12-12 25 views
38

yüzdenSwift opsiyonel değişken atama (çift soru işareti)

let foo = dict["key"] as? String ?? "empty" 
var bar = some_func(string: foo!) 

yapmaya çalışıyordu ve XCode 6 ikinci satırda olduğunu
Operand of postfix '!' should have optional type; type is 'String'
şikayet ediyor.

Ben

let foo: String? = dict["key"] as? String ?? "empty" 

ilk satırı değiştirirseniz hata ortadan kalkar.

Bu bir çeşit kusur mu, yoksa yanlış bir şey mi yapıyorum?

cevap

110

sıfır coalescing operatör a ?? b bu açılmamış sol işlenen veya sağ işlenen ya döndürür

a != nil ? a! : b 

için bir kısa yoldur. Yani foo tipi String olup foo isteğe bağlı değildir ve açılmamış edilemez çünkü ikinci satır ünlem işareti olmadan

var bar = some_func(string: foo) 

olmalıdır.

(daha sonra

let foo: String? = dict["key"] as? String ?? "empty" 

ilk satırı değiştirirseniz sağ tarafta sonucu tekrar isteğe bağlı bir dize içine sarılmış ve ikinci satırda açıkta olması gerekiyor. Bu hatayı yapar go away, ancak bu istediğini muhtemelen değildir.) nil kaynaştırma operatörü ?? sizin koşullu döküm paketini edecek ya çünkü .some ise

4

sizin foo bir String değil String? olacak (birsonuçlanan 10) ya da String olan "empty"'u kullanacaktır.

İlgili konular