Подтвердить что ты не робот

Заказанная карта в Свифте

Есть ли встроенный способ создания упорядоченной карты в 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, скорее всего будет более эффективным.

4b9b3361

Ответ 1

Вы можете заказать их с помощью клавиш с типом Int.

var myDictionary: [Int: [String: String]]?

или

var myDictionary: [Int: (String, String)]?

Я рекомендую первый, так как это более распространенный формат (например, JSON).

Ответ 2

Просто используйте массив кортежей. Сортируйте все, что захотите. Все "встроенные".

var array = [(name: String, value: String)]()
// add elements
array.sort() { $0.name < $1.name }
// or
array.sort() { $0.0 < $1.0 }

Ответ 4

Как говорит Мэтт, словари (и наборы) представляют собой неупорядоченные коллекции в Swift (и в Objective-C). Это по дизайну.

Если вы хотите, вы можете создать массив ключей словаря и отсортировать его в любом порядке, а затем использовать его для извлечения элементов из своего словаря.

NSDictionary имеет метод allKeys, который дает вам все ключи вашего словаря в массиве. Кажется, я помню нечто похожее на объекты Swift Dictionary, но я не уверен. Я все еще изучаю нюансы Свифта.

EDIT:

Для Swift Dictionaries someDictionary.keys

Ответ 6

если ваши ключи подтверждают сопоставимость, вы можете создать отсортированный словарь из вашего несортированного словаря следующим образом

let sortedDictionary = unsortedDictionary.sorted() { $0.key > $1.key }

Ответ 7

Я знаю, что мне нравится вечеринка, но вы заглянули в NSMutableOrderedSet?

https://developer.apple.com/reference/foundation/nsorderedset

Вы можете использовать упорядоченные множества в качестве альтернативы массивам, когда порядок элементы важны и производительность при проверке того, является ли объект содержащихся в наборе, является рассмотрение-тестирование для членства в массив медленнее, чем тестирование для членства в наборе.

Ответ 8

    var orderedDictionary = [(key:String, value:String)]()

Ответ 9

Как говорили другие, нет никакой поддержки для такого типа структуры. Возможно, в какой-то момент они добавят реализацию в стандартную библиотеку, но, учитывая ее относительно редкое, это лучшее решение в большинстве приложений, поэтому я бы не задерживал дыхание.

Один из вариантов - проект OrderedDictionary. Поскольку он придерживается BidirectionalCollection вы получаете большинство тех же API, которые вы, вероятно, используете для использования с другими типами Collection, и, по-видимому, (в настоящее время) достаточно хорошо поддерживаются.

Ответ 10

Вот что я сделал, довольно просто:

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 но вы можете использовать клавиши массива.

Ответ 11

используйте 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"