Saat ini saya menggunakan potongan kode (canggung) berikut untuk menentukan apakah kamus Swift (kosong) berisi kunci yang diberikan dan untuk mendapatkan satu (setiap) nilai dari kamus yang sama.
Bagaimana seseorang dapat menempatkan ini dengan lebih elegan di Swift?
// excerpt from method that determines if dict contains key
if let _ = dict[key] {
return true
}
else {
return false
}
// excerpt from method that obtains first value from dict
for (_, value) in dict {
return value
}
swift
dictionary
Drux
sumber
sumber
indexForKey
jika Anda merasa lebih jelas dan lebih eksplisit; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
Di?? ""
sini pada dasarnya berarti "jika tidak ada kunci seperti itu, kembalikan yang kosong".Jawaban:
Anda tidak perlu setiap kode khusus untuk melakukan hal ini, karena itu adalah apa kamus sudah tidak. Ketika Anda mengambil
dict[key]
Anda tahu apakah kamus berisi kunci, karena Opsional yang Anda dapatkan tidaknil
(dan itu berisi nilai).Jadi, jika Anda hanya ingin menjawab pertanyaan apakah kamus berisi kunci, tanyakan:
Jika Anda menginginkan nilainya dan Anda tahu kamus berisi kunci, katakan:
Tetapi jika, seperti biasanya terjadi, Anda tidak tahu itu berisi kunci - Anda ingin mengambil dan menggunakannya, tetapi hanya jika ada - maka gunakan sesuatu seperti
if let
:sumber
dict.values
.dict.values
buram. Anda dapat bersepeda melalui itu tapi itu saja. (Oke, bukan hanya itu, tapi buat aku senang.) Jika kamu ingin itu diubah menjadi Array, ambildict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
Ini Opsional, sama seperti dulu.Mengapa tidak memeriksa saja
dict.keys.contains(key)
? Memeriksadict[key] != nil
tidak akan berfungsi dalam kasus di mana nilainya nol. Seperti halnya dengan kamus[String: String?]
misalnya.sumber
if let val = dict[key]
Anda dapat menggunakanif let val = dict[key] as? String
dalam hal ini.dict.keys
yang membuat array dengan semua kunci, kemudian (2) memeriksa setiap kunci secara berurutan sampai Anda menemukan satu (atau tidak ada!). Saya sadar Anda sedang berusaha menangani kasus a[String: String?]
, tetapi akan sangat berhati-hati dengan solusi itu ...Jawaban yang diterima
let keyExists = dict[key] != nil
tidak akan berfungsi jika Kamus berisi kunci tetapi memiliki nilai nihil.Jika Anda ingin memastikan Kamus tidak mengandung kunci sama sekali gunakan ini (diuji dalam Swift 4).
sumber
== nil
tidak berfungsi, meskipun kamus memiliki nilai opsional. Ini karena hasil pencarian dibungkus sebagaiOptional
. Di sisi lain, untuk memeriksa apakah nilai tampak benarnil
- benar daripada tidak ada, Anda dapat menggunakannya== .some(nil)
.O(1)
. Lihat juga: github.com/apple/swift-evolution/blob/master/proposals/… Apa yang membuat Anda berpikir ituO(n)
?Dictionary.Keys.contains(...)
fungsi di sini mengatakan memilikiO(n)
kompleksitas, di manan
panjang urutannya.Sepertinya Anda mendapatkan apa yang Anda butuhkan dari @matt, tetapi jika Anda menginginkan cara cepat untuk mendapatkan nilai untuk kunci, atau hanya nilai pertama jika kunci itu tidak ada:
Catatan, tidak ada jaminan apa yang akan Anda dapatkan sebagai nilai pertama, itu hanya terjadi dalam kasus ini untuk mengembalikan "merah".
sumber
??
operator mengambil solusi kenyamanan saya, tetapi sebagai perpanjangan nilai default itu dapat menghadirkan ketidakamanan data atau perilaku tak terduga. Kedengarannya seperti sesuatu subkelas konkret yangDictionary
harus dipekerjakan. Seberapa sering Anda memerlukan nilai pertama jikanil
pengembalian tidak termasuk fungsi khusus situasi?sumber
Solusi saya untuk implementasi cache yang menyimpan NSAttributedString opsional:
sumber
Inilah yang berfungsi untuk saya di Swift 3
sumber