我在Swift中有一个Dictionary
,我想获得一个特定索引的密钥。
var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
我知道我可以遍历密钥并记录它们
for key in myDict.keys{
NSLog("key = \(key)")
}
然而,奇怪的是,这样的事情是不可能的
var key : String = myDict.keys[0]
为什么?
答案 0 :(得分:168)
那是因为keys
返回LazyMapCollection<[Key : Value], Key>
,无法使用Int进行下标。处理此问题的一种方法是使字典的startIndex
按您想要下标的整数推进,例如:
let intIndex = 1 // where intIndex < myDictionary.count
let index = myDictionary.startIndex.advancedBy(intIndex) // index 1
myDictionary.keys[index]
另一种可能的解决方案是初始化一个以keys
为输入的数组,然后你可以在结果上使用整数下标:
let firstKey = Array(myDictionary.keys)[0] // or .first
请记住,词典本质上是无序的,因此不要指望给定索引处的键始终是相同的。
答案 1 :(得分:40)
Swift 3:Array()
可以用来做到这一点。
获取密钥:
let index = 5 // Int Value
Array(myDict)[index].key
获取价值
Array(myDict)[index].value
答案 2 :(得分:23)
Here is a small extension for accessing keys and values in dictionary by index:
function newProblem(){
var x=Math.floor(Math.random() * 10);
$("#firstNumberDiv").text(x);
}
答案 3 :(得分:10)
你可以迭代一个字典并使用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
}
如果你想创建一个有序字典,你应该看看泛型。
答案 4 :(得分:8)
如果您需要使用带有Array实例的API的字典键或值,请使用keys或values属性初始化新数组:
let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
答案 5 :(得分:5)
SWIFT 3.第一个元素的示例
.all-smiles h1 {
color: white;
display: inline;
margin-right: 3%;
vertical-align: middle;
line-height: 1;
}
答案 6 :(得分:4)
在 Swift 3 中尝试使用此代码获取指定索引处的键值对(元组):
extension Dictionary {
subscript(i:Int) -> (key:Key,value:Value) {
get {
return self[index(startIndex, offsetBy: i)];
}
}
}
答案 7 :(得分:3)
这是一个使用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
答案 8 :(得分:2)
稍微偏离主题:但是,如果你有一个 词典数组 即: [[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
答案 9 :(得分:0)
我在寻找像Java中的LinkedHashMap这样的东西。如果我没有弄错的话,Swift和Objective-C都没有。
我最初的想法是将我的字典包装在一个数组中。 [[String: UIImage]]
然后我意识到从字典中抓取密钥对Array(dict)[index].key
来说是古怪的,所以我选择了元组。现在,我的数组看起来像[(String, UIImage)]
,因此我可以通过tuple.0
检索它。不再将其转换为数组。我的2美分。