2015-03-27 14 views

cevap

54

if dictionary.indexForKey("someKey") != nil { 
    // the key exists in the dictionary 
} 

Swift 3 sözdizimi .... Aslında test dictionary[key] == nil kilit bir sözlükte varsa kontrol etmek için kullanılabilir. değeri nil olarak ayarlanırsa O true vermez:

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

dict["a"] == nil // false,  dict["a"] is .Some(.Some(1)) 
dict["b"] == nil // false !!, dict["b"] is .Some(.None) 
dict["c"] == nil // true,  dict["c"] is .None 

"tuşuna dict mevcut değil" ve ayırt etmek Eğer yuvalanmış opsiyonel atama yapabilir "anahtarın değeri sıfırdır":

if let val = dict["key"] { 
    if let x = val { 
     println(x) 
    } else { 
     println("value is nil") 
    } 
} else { 
    println("key is not present in dict") 
} 
+0

Vay bu delilik. Neden "[" b "] == nil 'yanlış olarak değerlendirilir? – vrwim

+8

@vrwim: 'dict [" b "]' bir "iç içe isteğe bağlı" ve "Int" türüne sahip, gerçek değer ".Some (.None )' :) Bu konuda daha fazla okuyabilirsiniz Swift blogu https://developer.apple.com/swift/blog/?id=12. Ayrıca bu soruya http://stackoverflow.com/a/27226589/1187415 adresli bir soruya da bakınız. –

+0

Güzel, ama bu gelecekte bazı sorunlara neden olabileceğini düşünüyorum. Bu var olduğunu bildiğime sevindim. – vrwim

2

Hep yapabilirsiniz:

let arrayOfKeys = dictionary.allKeys 
if (arrayOfKeys.containsObject(yourKey)) { 

} 
else { 
} 

Ancak gerçekten isteğe bağlı öğeleri içerebilir bir NSDictionary yaratma fikri sevmediğim.

+1

Bu, Objective-C kodu ve bir Swift Dictionary'deki yanıtı öğrenmek istedim. – vrwim

+0

Bu Hedef-C nerede? İşte Swift'deki allKeys yöntemi: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/index.html#//apple_ref/occ/instp/NSDictionary/allKeys ve işte burada nesne yöntemi içerir: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/#//apple_ref/occ/instm/NSArray/containsObject:. Ben bir NSArray bildirme yeteneğine sahip olmanızı bekledim ... –

+2

NSArray – vrwim

27

Sözlük türünün indexForKey(key: Key) aradığınız şey olduğuna inanıyorum. Belirli bir anahtarın indeksini döndürür, ancak daha önemlisi sizin önerileriniz için, eğer sözlükte belirtilen anahtarı bulamazsa nil döndürür.

if dictionary.index(forKey: "someKey") == nil { 
    print("the key 'someKey' is NOT in the dictionary") 
} 
+0

değil Swift türlerini kullanmak istiyorum Açık ve net olduğunu kabul ediyorum. Birçok durumda en iyi deyim olabilir. – Fattie

-1

Bu benim için çalışıyor [Swift 3.0]:

let myVar = "c" 
let myDict: [String: Int] = ["a": 0, "b": 1, "c": 2] 
if myDict.keys.contains(myVar) { 
    print(myVar) 
} else { 
    print("ERROR") 
} 
+0

Bu soru Swift dizilerindeki isteğe bağlı seçenekler hakkındadır. – vrwim

+0

Daha sonra, söz konusu soruda açıkça belirtmeniz gerekiyordu. – Derreck

+2

Başlıkta bile var. – vrwim

1

bu deneyin:

Umut sizin için çalışıyor. Teşekkür

+0

Birçok kişi işaret ettiği gibi, değerin sıfır olması durumunda bu işe yaramaz. Eğer değer sıfır olamazsa bu harikadır – eonist

0

Ben Swift 4'te bu şekilde ele:

extension Dictionary { 
    func contains(key: Key) -> Bool { 
     let value = self.contains { (k,_) -> Bool in key == k } 
     return value 
    } 
} 

Bu Dictionary.contains(where: (key: Hashable, value: Value) throws -> Bool) kullanır. Bir uzantı olarak kapsülleyerek, kodumu değiştirmeden uygulamayı daha iyi bir şeye güncellemede iyi bir şansım var. index(forKey:Key)'un yaptığı veriyi oluşturmaktan kaçınıyorum. keys erişiminden daha verimli olduğunu umuyorum, çünkü bu aramadan önce tüm diziyi oluşturmalıdır.

İlgili konular