Swift

2014-12-01 19 views
8

'da iki (veya daha fazla) isteğe bağlı bir Apple'ın LLDB hata ayıklayıcısı hakkındaki videosunu izlerken, bunun için bir açıklama bulamadım;Swift

var optional: String? = nil; //This is ok, a common optional 
var twice_optional: String?? = nil; //What is this and why's this useful?? 

ben bir oyun açtı ve dışarı çalışırken başladı ve istediğiniz kadar ? kadar yazma ve sonra ! aynı sayıda onları paketini fark etti: yazdığı zaman o isteğe bağlı değerler bahsediyordu . konseptini değişkenini sarma/ayırma kavramını anlıyorum ama 4, 5 veya 6 kat değerde bir değer sarmak istediğim bir durum düşünemiyorum.

cevap

10

"Çifte opsiyoneller" yararlı olabilir ve Swift blog girişi "Optionals Case Study: valuesForKeys" bir uygulamayı tarif etmektedir.

let dict : [String : String?] = ["a" : "foo" , "b" : nil] 

değerler olarak isteğe bağlı dizeleri ile bir sözlük geçerli:

İşte basitleştirilmiş bir örnektir. Bu nedenle

let val = dict[key] 

tip Optional<Optional<String>> aka String?? sahiptir. Sözdiziminde anahtar yoksa ve .Some(x) ise .None (veya nil) şeklindedir. İkinci durumda, xOptional<String> aka String? ve s bir String olduğu .None (veya nil) veya .Some(s) olabilir.

kullanabilirsiniz bağlayıcı isteğe bağlı çeşitli durumlar için kontrol etmek iç içe:

for key in ["a", "b", "c"] { 

    let val = dict[key] 
    if let x = val { 
     if let s = x { 
      print("\(key): \(s)") 
     } else { 
      print("\(key): nil") 
     } 
    } else { 
     print("\(key): not present") 
    } 

} 

Çıktı:

a: foo 
b: nil 
c: not present 

Aynı desen içinde eşleşen nasıl gerçekleştirilebileceği görmek öğretici olabilir Bir anahtar deyimi:

veyakullanarak .Some(x) ile eşanlamlı olarakkalıbı:

let val = dict[key] 
switch val { 
case let (s??): 
    print("\(key): \(s)") 
case let (s?): 
    print("\(key): nil") 
case nil: 
    print("\(key): not present") 
} 

(Ben daha derinden iç içe seçeneklere için mantıklı bir uygulama bilmiyorum.)

+0

Ayrıca, kapsamlı olmak için, bir deneyin? ... gibi? ... bir çift İsteğe bağlı dönecektir. –

+0

@ Cœur: Evet, ancak bu parantez ile çözülebilir: eğer değer = (deneyin? ...) izin verirse? ... {...} ', isteğe bağlı bir isteğe bağlı bağlamanın başka bir isteğe bağlı seviye eklememesi nedeniyle. –

+0

Sonra, başka bir örnek, 'UIApplication.shared.delegate? .window' bir çift isteğe bağlıdır. Pencereyi açmak için '' 'eklemeniz gerekecek. –

1
var tripleOptional: String??? 

Bu anlatılanlar yararlı kullanım düşünemiyorum

var tripleOptional: Optional<Optional<Optional<String>>> 

aynıdır, ancak onun opsiyoneller nesne her türlü jenerik iş orada çünkü. İç içe geçmiş isteğe bağlı kutular, başka bir kutuya veya diziye yerleştirilmiş kutuya benzer bir diziye benzer. (Swift 2. için güncellenmiş)

+0

Evet, haklısın. Ancak, bazı durumlarda diziler dizilerinin dizileri bile yararlı olabilir. İsteğe bağlı herhangi bir türü kabul etse bile, isteğe bağlı türün isteğe bağlı türde bir değeri ne kadar kez sarmalayabileceğini kontrol edebildiğini düşündüğüm dil seçeneği vardır.Bakalım birisi gözümüzü açarsa – Sherekan