2015-10-10 26 views
13

Eğer geri dönerse bir dize paketini nasıl:Çift isteğe bağlı nasıl açılır?

(İsteğe bağlı (İsteğe bağlı "mavi"))

var cityName = String() 

    if let cityAnno = annotation as MGLAnnotation! { 

     cityName = String(stringInterpolationSegment: cityAnno.title!) 

    } 

cityLabelName.text = ("\(cityName), \(county)") 

cityLabelName (İsteğe bağlı "New York'ta")

cevap

61

güvenli değildir çift bu çifte String sarılmış gibi opsiyonel:

let a: String?? = "hello" 
print(a as Any) // "Optional(Optional("hello"))\n" 

@Leo, ilgilenir misin gösterdi isteğe bağlı 2 numaralı bağlantı noktasını iki kez kullanın:

veya kuvvet iki kez paketini:

Ayrıca kullanabilirsiniz:

Yöntem 1: Burada

print(value!!) // don't do this - you're just asking for a crash 

güvenle bir opsiyonel çift unwrap kullanabilirsiniz 4 daha yöntemlerdir desen eşleştirme:

if case let value?? = a { 
    print(value) // "hello\n" 
} 
Alternatif olarak

, iki kez operatör?? birleştirici nil kullanabilir: Yöntem


print((a ?? "") ?? "") // "hello\n" 

Yöntem 3:

Yoksa isteğe bağlı bağlama ile ?? kullanabilirsiniz:

if let value = a ?? nil { 
    print(value) // "hello\n" 
} 

Yöntem 4: Ayrıca

, isteğe bağlı bağlama ile flatMap kullanabilirsiniz:

if let value = a.flatMap({ $0 }) { 
    print(value) // "hello\n" 
} 
+9

The ?? nil 'parlak! – fpg1503

+2

Bu en iyi yanıt, özellikle Yöntem 3'tür. – nobre

+0

Kalıp eşleme sözdiziminin bir kısmı alışık olmasına rağmen yöntem 1'i beğenirim. Yöntem 3 neden ve nasıl çalışır? – Raginmari

5

deneyin olarak yazdırır oyun alanı
var a:String?? = "1" 
print((a)) 
if let b = a,c = b{ 
    print(c) 
} 

Ekran

enter image description here

Ayrıca unwrap zorlayabilir, ama buna Verilen

let d = a!! 
+0

Teşekkür Bu, hile yaptı. –