web-dev-qa-db-ja.com

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]

どうして ?

98
the_critic

これは、keysLazyMapCollection<[Key : Value], Key>を返すためです。これは、Intでは添え字付けできません。これを処理する1つの方法は、辞書の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

辞書は本質的に順序付けられていないため、指定されたインデックスのキーが常に同じであると期待しないでください。

170
Mick MacCallum

Swift 3:Array()はこれを行うのに便利です。

キーの取得:

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

値を取得:

Array(myDict)[index].value
40
roy

以下は、インデックスによって辞書のキーと値にアクセスするための小さな拡張です。

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

辞書を反復処理し、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
}

順序付けされた辞書を作成する場合は、Genericsを調べる必要があります。

10

から 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"]
8
Jack

Swift 3.最初の要素の例

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

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

Swiftでは、このコードを使用して、指定されたインデックスでキーと値のペア(タプル)を取得しようとします。

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

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
3
Sean Chen

スイフト4


少しトピック:しかし、ここにあるのは辞書の配列i.e: [[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
2
Suhaib

JavaのLinkedHashMapのようなものを探していました。誤解しない限り、SwiftもObjective-Cも持っていません。

私の最初の考えは、辞書を配列にラップすることでした。 [[String: UIImage]]が、辞書からキーを取得することはArray(dict)[index].keyで奇抜であることに気づいたので、Tuplesを使用しました。これで私の配列は[(String, UIImage)]のように見えるので、Tuple.0で取得できます。配列に変換する必要はもうありません。ちょうど2セントです。

0
newDeveloper