Swift'te bir sözlüğe elemanlar nasıl eklenir?


217

Ben gibi tanımlanmış basit bir Sözlük var:

var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]

Şimdi bu sözlüğe bir eleman eklemek istiyorum: 3 : "efg"

3 : "efg"Bu mevcut sözlüğe nasıl ekleyebilirim ?


NSMutableDictionary kullan
Saurabh Prajapati

1
Anahtarlarınız 1, 2 ve 3 sayıları olduğu için bir dizi değil, sözlük istediğinizden emin misiniz?
gnasher729

Yanıtlar:


240

Kullanıyorsunuz NSDictionary. Herhangi bir nedenden ötürü açıkça bu tür olması gerekmedikçe, bir Swift sözlüğü kullanmanızı öneririm.

Sen bekliyor herhangi işleve bir Swift sözlüğü geçebilir NSDictionary, çünkü fazladan bir şey yapmadan Dictionary<>ve NSDictionarysorunsuz birbirlerine köprü. Yerel Swift yolunun avantajı, sözlüğün genel türleri kullanmasıdır, bu nedenle Intanahtar Stringolarak ve değer olarak tanımlarsanız , yanlışlıkla farklı türlerdeki anahtarları ve değerleri kullanamazsınız. (Derleyici sizin adınıza türleri kontrol eder.)

Kodunuzda gördüklerime dayanarak, sözlüğünüz Intanahtar ve Stringdeğer olarak kullanır . Bir örnek oluşturmak ve daha sonra bir öğe eklemek için bu kodu kullanabilirsiniz:

var dict = [1: "abc", 2: "cde"] // dict is of type Dictionary<Int, String>
dict[3] = "efg"

Daha sonra bunu bir tür değişkenine atamanız gerekirse NSDictionary, sadece açık bir döküm yapın:

let nsDict = dict as! NSDictionary

Ve daha önce de belirtildiği gibi, onu beklediğiniz bir işleve NSDictionarygeçirmek istiyorsanız, herhangi bir döküm veya dönüştürme olmadan olduğu gibi geçirin.


Bir kişinin gerçekte ne yapması gerektiğine dair doğru bir açıklama için teşekkürler. Bir Dictionarynesneyi oluşturmak ve manipüle etmek için Swift'in rahatlığından yararlanın ve sonra NSDictionarygerekiyorsa sonunda dönüştürün . Olağanüstü. Teşekkürler.
Joshua Pinter

Yine de ben bir anahtar ( addValue benzer ) kullanarak aynı anahtar eklemek olabilir . Gibi Yani eklemek bir "Antonio"tuşa 1öylesine dic[1]dönecekti "abc, Antonio".
Tatlım

@honey farkında değilim ... ama eleman zaten varsa basit bir ek
Antonio

113

Aşağıdaki şekilde ve değişim kullanarak ekleyebilir DictionaryiçinNSMutableDictionary

dict["key"] = "value"

2
Şeklinde bir hata mesajı varCannot assign to the result of this expression
Dharmesh Kheni

soru yönünüz için bu yolu ekleyin [3] = "efg";
yashwanth77

benim düzenlenmiş cevap kontrol benim için çalışıyor.
yashwanth77

1
dict["testval"] = "test".. Hatafatal error: unexpectedly found nil while unwrapping an Optional value
jose920405

2
2.2+ ile çalışmaz, dict bu ifadede salt okunur
jeveloper

67

Bunun çok geç olabileceğini biliyorum, ama birisi için yararlı olabilir. Bu nedenle, anahtar kelimelere anahtar değer çiftlerini hızlı bir şekilde eklemek için updateValue (value:, forKey:) yöntemini aşağıdaki gibi kullanabilirsiniz:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)

49

SWIFT 3 - XCODE 8.1

var dictionary =  [Int:String]() 

dictionary.updateValue(value: "Hola", forKey: 1)
dictionary.updateValue(value: "Hello", forKey: 2)
dictionary.updateValue(value: "Aloha", forKey: 3)

Yani, sözlüğünüz şunları içerir:

sözlük [1: Hola, 2: Merhaba, 3: Aloha]


3
Bu nasıl daha iyi dictionary[1] = "Hola"?
Ben Leggiero

Bunu yapmanın başka bir yoludur. Hepsi neye ihtiyacınız olduğuna bağlıdır! Benim durumum, bu en iyi yol
Cristian Mora

4
Bunun daha iyi olduğunu düşündüğünüzü anlıyorum; bu yüzden gönderdiniz. Ama bunun nasıl daha iyi olduğunu görmüyorum. Lütfen, bunun daha iyi olduğunu söyle
Ben Leggiero

"AddValue" veya "setValue" adlı bir yöntem olması gerektiğini, "updateValue" adının söylediği gibi UPDATING için kullanılması gerektiğini kabul
ediyorum

Bunun nedeni, sözlük başlatıldığında nil'den farklı bir değere [] sahip olmasıdır, bu nedenle değeri değiştirip eklememeye çalıştığımızdan updateValue özelliğini kullanın.
Cristian Mora

16

Sözlüğünü ise Inthiç Stringbasitçe yapabilirsiniz:

dict[3] = "efg"

Sözlük değerine eleman eklemek istiyorsanız , olası bir çözüm:

var dict = Dictionary<String, Array<Int>>()

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)

16

Hızlı 3+

Sözlüğe yeni değerler atamak için örnek. NSMutableDictionary olarak bildirmeniz gerekir:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)

12

Swift'te NSDictionary kullanıyorsanız şunları kullanabilirsiniz setValue:

dict.setValue("value", forKey: "key")

1
cevabınızı düzenlediyseniz, gelecekte downvotes önlemek için daha fazla bilgi eklemeyi düşünün.
Juan Boero

11

Aşağıdaki gibi iki sözlük verilmiştir:

var dic1 = ["a": 1, "c": 2]
var dic2 = ["e": 3, "f": 4]

Burada tüm öğeleri ekleyebilir nasıl dic2 için dic1 :

dic2.map {
   dic1[$0.0] = $0.1
}

Şerefe A.


9
Kullanımı daha iyidir .forEachyerine .mapherhangi dönüş eşleştirilmiş dizi gerekmez olarak
haik.ampardjian

9

Dict.updateValue varolan anahtarın değerini sözlükten günceller veya anahtar yoksa yeni yeni anahtar / değer çifti ekler.

Misal-

var caseStatusParams: [String: AnyObject] = ["userId" : UserDefault.userID ]
caseStatusParams.updateValue("Hello" as AnyObject, forKey: "otherNotes")

Sonuç-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"

7

Aşağıdaki [String:Any]yerine kullanan öğrenciler Dictionaryiçin uzantısı

extension Dictionary where Key == String, Value == Any {

    mutating func append(anotherDict:[String:Any]) {
        for (key, value) in anotherDict {
            self.updateValue(value, forKey: key)
        }
    }
}

4

Swift 5 itibariyle, aşağıdaki kod koleksiyonu çalışır.

 // main dict to start with
 var myDict : Dictionary = [ 1 : "abc", 2 : "cde"]

 // dict(s) to be added to main dict
 let myDictToMergeWith : Dictionary = [ 5 : "l m n"]
 let myDictUpdated : Dictionary = [ 5 : "lmn"]
 let myDictToBeMapped : Dictionary = [ 6 : "opq"]

 myDict[3]="fgh"
 myDict.updateValue("ijk", forKey: 4)

 myDict.merge(myDictToMergeWith){(current, _) in current}
 print(myDict)

 myDict.merge(myDictUpdated){(_, new) in new}
 print(myDict)

 myDictToBeMapped.map {
     myDict[$0.0] = $0.1
 }
 print(myDict)

4

Sözlüğe veri ekleme işlevi yoktur. Değeri varolan sözlükte yeni anahtara atamanız yeterlidir. sözlüğe otomatik olarak değer katacaktır.

var param  = ["Name":"Aloha","user" : "Aloha 2"]
param["questions"] = "Are you mine?"
print(param)

Çıktı gibi olacak

["Ad": "Aloha", "kullanıcı": "Aloha 2", "sorular": "" Sen benim misin? "]


3
For whoever reading this for swift 5.1+

  // 1. Using updateValue to update the given key or add new if doesn't exist


    var dictionary = [Int:String]()    
    dictionary.updateValue("egf", forKey: 3)



 // 2. Using a dictionary[key]

    var dictionary = [Int:String]()    
    dictionary[key] = "value"



 // 3. Using subscript and mutating append for the value

    var dictionary = [Int:[String]]()

    dictionary[key, default: ["val"]].append("value")

2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "sample@email.com"
print(dict)

1
Lütfen bu cevabın neden sorunu çözdüğü hakkında bilgi verin
Stephen Reindl

@StephenReindl Eğer çalıştırırsanız göreceksiniz;)
Ben Leggiero

1

Yeni öğeler eklemek için şunları ayarlayın:

listParrameters["your parrameter"] = value

0

Şimdiye kadar en iyi yolu Swift sözde veri azaltmak için bulduk bulduk üst düzey işlevlerinden biri Swift yani "azaltmak". Aşağıdaki kod snippet'ini izleyin:

newDictionary = oldDictionary.reduce(*newDictionary*) { r, e in var r = r; r[e.0] = e.1; return r }

@ Dharmesh Sizin durumunuzda,

newDictionary = dict.reduce([3 : "efg"]) { r, e in var r = r; r[e.0] = e.1; return r }

Yukarıdaki sözdizimini kullanırken herhangi bir sorun bulursanız lütfen bize bildirin.


0

Swift 5 mutlu kodlama

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}

-1

Sözlük uzantısı ekledim

extension Dictionary {   
  func cloneWith(_ dict: [Key: Value]) -> [Key: Value] {
    var result = self
    dict.forEach { key, value in result[key] = value }
    return result  
  }
}

Kullanabileceğiniz cloneWithböyle

 newDictionary = dict.reduce([3 : "efg"]) { r, e in r.cloneWith(e) }

-10

NSDictionary değiştirmek veya güncellemek istiyorsanız, önce NSMutableDictionary olarak yazın

let newdictionary = NSDictionary as NSMutableDictionary

o zaman kullan

 newdictionary.setValue(value: AnyObject?, forKey: String)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.