Dictionary
,我想获取特定索引处的键。var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
我知道可以迭代遍历键并记录它们
for key in myDict.keys{
NSLog("key = \(key)")
}
然而,奇怪的是,像这样的事情是不可能的
var key : String = myDict.keys[0]
为什么?
Dictionary
,我想获取特定索引处的键。var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
我知道可以迭代遍历键并记录它们
for key in myDict.keys{
NSLog("key = \(key)")
}
然而,奇怪的是,像这样的事情是不可能的
var key : String = myDict.keys[0]
这是因为 keys
返回的是 LazyMapCollection<[Key : Value], Key>
,它无法使用 Int
进行下标。解决此问题的一种方法是通过将字典的 startIndex
前进你想要下标的整数来处理,例如:
let intIndex = 1 // where intIndex < myDictionary.count
let index = myDictionary.index(myDictionary.startIndex, offsetBy: intIndex)
myDictionary.keys[index]
另一种可能的解决方案是使用keys
作为输入初始化一个数组,然后可以在结果上使用整数下标:
let firstKey = Array(myDictionary.keys)[0] // or .first
记住,字典本质上是无序的,因此不要期望给定索引处的键始终相同。
Array(myDict)[0].0
,因为它不会复制键数组,并且不应该复制字典的内部结构,尽管可能会有这种情况。 - David BerrymyDict[keysArray[0]]
。 - Zev Eisenberg'NSDictionary' 无法转换为 '_ArrayBuffer<T>'
- ChrisSwift 3: 使用Array()
可能很有用。
获取关键字:
let index = 5 // Int Value
Array(myDict)[index].key
获取值:
Array(myDict)[index].value
["a": 1, "b": 2]
这样的字典可以转换为字典数组,例如[[key: "a", value: 1], [key: "b", value: 2]]
,然后可以通过索引访问。 - Peter Rcell.artwork.image = Array(albumDict)[indexPath.item].value.first?.artwork?.image
,我使用这个长链只是为了从值中获取一个值。 - Zhou Haibo这里是一个用于通过索引访问字典键和值的小扩展:
extension Dictionary {
subscript(i: Int) -> (key: Key, value: Value) {
return self[index(startIndex, offsetBy: i)]
}
}
你可以使用for-in和enumerate迭代字典并获取索引(就像其他人所说的一样,不能保证它会像下面这样有序)
let dict = ["c": 123, "d": 045, "a": 456]
for (index, entry) in enumerate(dict) {
println(index) // 0 1 2
println(entry) // (d, 45) (c, 123) (a, 456)
}
如果你想要先进行排序..
var sortedKeysArray = sorted(dict) { $0.0 < $1.0 }
println(sortedKeysArray) // [(a, 456), (c, 123), (d, 45)]
var sortedValuesArray = sorted(dict) { $0.1 < $1.1 }
println(sortedValuesArray) // [(d, 45), (c, 123), (a, 456)]
然后迭代。
for (index, entry) in enumerate(sortedKeysArray) {
println(index) // 0 1 2
println(entry.0) // a c d
println(entry.1) // 456 123 45
}
如果您想创建一个有序字典,可以考虑使用泛型。
dict.enumerated().forEach { (index, element) in ... }
- Matthew Korporaal如果您需要使用字典的键或值与需要Array实例的API一起使用,则可以使用keys或values属性初始化一个新数组:
let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
extension Dictionary {
subscript(i:Int) -> (key:Key,value:Value) {
get {
return self[index(startIndex, offsetBy: i)];
}
}
}
SWIFT 3. 第一个元素的示例
let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2]
if let firstLang = wordByLanguage.first?.key {
print(firstLang) // English
}
略微离题:但如果您有一个字典数组,即 [ [String : String] ]
var array_has_dictionary = [ // Start of array
// Dictionary 1
[
"name" : "xxxx",
"age" : "xxxx",
"last_name":"xxx"
],
// Dictionary 2
[
"name" : "yyy",
"age" : "yyy",
"last_name":"yyy"
],
] // end of array
cell.textLabel?.text = Array(array_has_dictionary[1])[1].key
// Output: age -> yyy
这里有一个示例,使用 Swift 1.2
var person = ["name":"Sean", "gender":"male"]
person.keys.array[1] // "gender", get a dictionary key at specific index
person.values.array[1] // "male", get a dictionary value at specific index
我在Java中寻找类似于LinkedHashMap的东西。如果我没记错的话,Swift和Objective-C都没有这个。
我的初步想法是将字典包装在数组中。[[String: UIImage]]
但后来我意识到使用Array(dict)[index].key
从字典中获取键名很奇怪,所以我选择了元组。现在我的数组看起来像这样[(String, UIImage)]
,所以我可以通过tuple.0
检索它。不再将其转换为数组。这只是我的个人见解。