Ответ 1
Вы можете заказать их с помощью клавиш с типом Int
.
var myDictionary: [Int: [String: String]]?
или
var myDictionary: [Int: (String, String)]?
Я рекомендую первый, так как это более распространенный формат (например, JSON).
Есть ли встроенный способ создания упорядоченной карты в Swift 2? Массивы [T]
сортируются по порядку добавления к нему объектов, но словари [K : V]
не упорядочены.
Например
var myArray: [String] = []
myArray.append("val1")
myArray.append("val2")
myArray.append("val3")
//will always print "val1, val2, val3"
print(myArray)
var myDictionary: [String : String] = [:]
myDictionary["key1"] = "val1"
myDictionary["key2"] = "val2"
myDictionary["key3"] = "val3"
//Will print "[key1: val1, key3: val3, key2: val2]"
//instead of "[key1: val1, key2: val2, key3: val3]"
print(myDictionary)
Есть ли встроенные способы создания упорядоченной карты key : value
, упорядоченной так же, как и массив, или мне нужно создать собственный класс?
Я бы хотел избежать создания собственного класса, если это вообще возможно, потому что все, что включено Swift, скорее всего будет более эффективным.
Вы можете заказать их с помощью клавиш с типом Int
.
var myDictionary: [Int: [String: String]]?
или
var myDictionary: [Int: (String, String)]?
Я рекомендую первый, так как это более распространенный формат (например, JSON).
Просто используйте массив кортежей. Сортируйте все, что захотите. Все "встроенные".
var array = [(name: String, value: String)]()
// add elements
array.sort() { $0.name < $1.name }
// or
array.sort() { $0.0 < $1.0 }
"Если вам нужна упорядоченная коллекция пар ключ-значение и не нужен быстрый поиск ключей, который предлагает словарь, см. DictionaryLiteral тип для альтернативы". - https://developer.apple.com/reference/swift/dictionary
Как говорит Мэтт, словари (и наборы) представляют собой неупорядоченные коллекции в Swift (и в Objective-C). Это по дизайну.
Если вы хотите, вы можете создать массив ключей словаря и отсортировать его в любом порядке, а затем использовать его для извлечения элементов из своего словаря.
NSDictionary
имеет метод allKeys, который дает вам все ключи вашего словаря в массиве. Кажется, я помню нечто похожее на объекты Swift Dictionary, но я не уверен. Я все еще изучаю нюансы Свифта.
Для Swift Dictionaries someDictionary.keys
Swift не включает встроенную функцию упорядоченного словаря, и, насколько я знаю, Swift 2 не выполняет
Тогда вы создадите свое. Вы можете проверить эти руководства для справки:
если ваши ключи подтверждают сопоставимость, вы можете создать отсортированный словарь из вашего несортированного словаря следующим образом
let sortedDictionary = unsortedDictionary.sorted() { $0.key > $1.key }
Я знаю, что мне нравится вечеринка, но вы заглянули в NSMutableOrderedSet?
https://developer.apple.com/reference/foundation/nsorderedset
Вы можете использовать упорядоченные множества в качестве альтернативы массивам, когда порядок элементы важны и производительность при проверке того, является ли объект содержащихся в наборе, является рассмотрение-тестирование для членства в массив медленнее, чем тестирование для членства в наборе.
var orderedDictionary = [(key:String, value:String)]()
Как говорили другие, нет никакой поддержки для такого типа структуры. Возможно, в какой-то момент они добавят реализацию в стандартную библиотеку, но, учитывая ее относительно редкое, это лучшее решение в большинстве приложений, поэтому я бы не задерживал дыхание.
Один из вариантов - проект OrderedDictionary. Поскольку он придерживается BidirectionalCollection
вы получаете большинство тех же API, которые вы, вероятно, используете для использования с другими типами Collection
, и, по-видимому, (в настоящее время) достаточно хорошо поддерживаются.
Вот что я сделал, довольно просто:
let array = [
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"]
]
// usage
for item in array {
let key = item.keys.first!
let value = item.values.first!
print(key, value)
}
Ключи не уникальны, поскольку это не Dictionary
а Array
но вы можете использовать клавиши массива.
используйте Dictionary.enumerated()
Пример:
let dict = [
"foo": 1,
"bar": 2,
"baz": 3,
"hoge": 4,
"qux": 5
]
for (offset: offset, element: (key: key, value: value)) in dict.enumerated() {
print("\(offset): '\(key)':\(value)")
}
// Prints "0: 'bar':2"
// Prints "1: 'hoge':4"
// Prints "2: 'qux':5"
// Prints "3: 'baz':3"
// Prints "4: 'foo':1"