如何从Swift中的Dictionary中获取特定索引处的键?

时间:2014-07-08 20:15:58

标签: ios dictionary swift

我在Swift中有一个Dictionary,我想获得一个特定索引的密钥。

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

我知道我可以遍历密钥并记录它们

for key in myDict.keys{

    NSLog("key = \(key)")

}

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

var key : String = myDict.keys[0]

为什么?

10 个答案:

答案 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)

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

如果您需要使用带有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)

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

答案 9 :(得分:0)

我在寻找像Java中的LinkedHashMap这样的东西。如果我没有弄错的话,Swift和Objective-C都没有。

我最初的想法是将我的字典包装在一个数组中。 [[String: UIImage]]然后我意识到从字典中抓取密钥对Array(dict)[index].key来说是古怪的,所以我选择了元组。现在,我的数组看起来像[(String, UIImage)],因此我可以通过tuple.0检索它。不再将其转换为数组。我的2美分。