簡體   English   中英

如何從 Swift 的字典中獲取特定索引處的鍵?

[英]How do I get the key at a specific index from a Dictionary in 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]

為什么 ?

這是因為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

請記住,字典本質上是無序的,因此不要期望給定索引處的鍵始終相同。

Swift 3 : Array()可用於執行此操作。

獲取密鑰:

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

獲取價值:

Array(myDict)[index].value

這是通過索引訪問字典中的鍵和值的小擴展:

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
}

如果你想創建一個有序的字典,你應該看看泛型。

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"]

SWIFT 3. 第一個元素的示例

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

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

Swift 3 中嘗試使用此代碼在給定索引處獲取鍵值對(元組):

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

快速 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

這是一個示例,使用 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檢索它。 不再將其轉換為數組。 只有我的 2 美分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM