Saya memiliki kamus yang berisi UIColor
benda-benda hash dengan nilai enum, ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Saya ingin dapat mengekstrak array dari semua warna (nilai-nilai) yang terkandung oleh kamus ini. Saya pikir saya bisa menggunakan values
properti, seperti yang digunakan saat iterasi nilai kamus ( for value in dictionary.values {...}
), tetapi ini mengembalikan kesalahan:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Tampaknya daripada mengembalikan Array
nilai, values
metode mengembalikan tipe koleksi yang lebih abstrak. Apakah ada cara untuk mendapatkan Array
nilai kamus tanpa mengekstraknya dalam satu for-in
lingkaran?
arrays
dictionary
swift
Stuart
sumber
sumber
colorsForColorSchemes.values
Jawaban:
Pada Swift 2.0,
Dictionary
'svalues
properti sekarang mengembalikanLazyMapCollection
bukannyaLazyBidirectionalCollection
. TheArray
tipe tahu bagaimana menginisialisasinya sendiri menggunakan jenis koleksi abstrak ini:Inferensi tipe Swift sudah tahu bahwa nilai-nilai ini adalah
UIColor
objek, jadi tidak perlu casting tipe, yang bagus!sumber
[0: "small", 1: "medium", 2: "large"]
mungkin TIDAK akan menghasilkan["small", "medium", "large"]
Anda dapat memetakan kamus ke array nilai:
Penutupan mengambil tuple nilai kunci dari kamus dan hanya mengembalikan nilai. Jadi, fungsi peta menghasilkan array nilai.
Versi yang lebih mudah dibaca dari kode yang sama:
MEMPERBARUI
Dari Xcode 9.0, nilai kamus dapat diakses menggunakan
values
properti, yang sesuai denganCollection
protokol:Biasanya Anda hanya menginginkannya sebagai array:
dan hanya itu.
sumber
Menggunakan
colorsForColorScheme.map({$0.value})
sumber
Anda dapat membuat ekstensi aktif
LazyMapCollection
colorsForColorSchemes.values.toArray()
ataucolorsForColorSchemes.keys.toArray()
sumber
Pertama, dari pernyataan berikut, tampaknya nama variabel (kamus) Anda
colorsForColorScheme
saat Anda mencoba untuk mendapatkan nilai-nilai dari
colorsForColorSchemes
kamus ketika Anda melakukannya-yang seharusnya memberi Anda kesalahan waktu kompilasi. Lagi pula saya berasumsi bahwa Anda memiliki kesalahan ketik, dan nama kamus Anda adalah
colorsForColorSchemes
. Jadi, inilah solusinya-Seperti disebutkan sebelumnya, karena properti inference tipe di swift, kode Anda dapat menyimpulkan bahwa tipe yang dikembalikan dari
.values
fungsi mengembalikan array UIColor. Namun, Swift ingin menjadi tipe-aman, jadi ketika Anda menyimpan nilai-nilai dalamcolors
array, Anda perlu mendefinisikannya secara eksplisit. Untuk swift 5 ke atas, sekarang Anda bisa melakukan follow-sumber
Saya menemukan ini sebagai yang paling berguna di Swift 5:
colorsForColorSchemes.allValues
Lihat dokumen - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
sumber
d.values
. Dalam latihanArray(d.values)