如何在 Swift 中从 Dictionary 中获取特定索引处的密钥?

我有一个在斯威夫特的 Dictionary和我想得到一个特定的索引键。

var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()

我知道我可以迭代键并记录它们

for key in myDict.keys{


NSLog("key = \(key)")


}

然而,奇怪的是,这样的事情是不可能的吗

var key : String = myDict.keys[0]

为什么?

181460 次浏览

这是因为 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

请记住,字典本质上是无序的,所以不要期望给定索引处的键总是相同的。

来自 https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html:

如果您需要将字典的键或值与接受 Array 实例的 API 结合使用,请使用键或值属性初始化一个新数组:

let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]

您可以在字典上迭代,并使用 for-in 获取索引并枚举(正如其他人所说的,不能保证它会像下面那样按顺序输出)

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
}

如果要创建有序字典,应该查看泛型。

这里有一个用于按索引访问 dictionary 中的键和值的小扩展:

extension Dictionary {
subscript(i: Int) -> (key: Key, value: Value) {
return self[index(startIndex, offsetBy: i)]
}
}

下面是一个使用 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

SWIFT3. 第一个元素的示例

let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2]


if let firstLang = wordByLanguage.first?.key {
print(firstLang)  // English
}

斯威夫特3: Array()可以很有用地做到这一点。

获取密钥:

let index = 5 // Int Value
Array(myDict)[index].key

获取价值:

Array(myDict)[index].value

Swift 3中,尝试使用以下代码获取给定索引处的键-值对(tuple) :

extension Dictionary {
subscript(i:Int) -> (key:Key,value:Value) {
get {
return self[index(startIndex, offsetBy: i)];
}
}
}

SWIFT 4


有点跑题: 但是如果你有一个 字典数组 即:[[ 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

我在找一个类似于 Java 中的 LinkedHashMap 的东西。如果我没记错的话,Swift 和 Objective-C 都没有。

我最初的想法是将字典封装在 Array 中。但是后来我意识到用 Array(dict)[index].key从字典中获取密钥有些古怪,所以我选择了 Tuple。现在我的数组看起来像 [(String, UIImage)],所以我可以通过 tuple.0检索它。不再将其转换为 Array。只有我的两分钱。