Swift: сортировка массива [Any] по типу элемента - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть массив, который содержит объекты разных типов.В моем реальном коде это пользовательские типы, которые соответствуют одному и тому же протоколу, но принцип также применим к следующему коду:

let anyObjectArray: [Any] = [51, "g", "hello", 1, 30111]

var sortedArray: [Any] = []

for item in anyObjectArray where item is Int {
    sortedArray.append(item)
}
for item in anyObjectArray where item is String {
    sortedArray.append(item)
}
print(sortedArray)

// 51, 1, 30111, "g", "hello"

Как вы можете видеть, я хочу отсортировать массив по типу элемента.

Мне интересно, если итерация несколько раз по массиву является подходящим подходом.Есть ли возможность использовать .map для сортировки массива по типу элемента, и если это так, будет ли это более эффективным?

Массивы в моем реальном коде будут содержать максимум 4-5 элементов, иногда только одинс другой стороны, было бы больше разных типов, чем просто два, поэтому число циклов for in будет больше (возможно, 4-5)

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это не приведет к сортировке массива, но сгруппирует элементы по типу в словаре

var map = [String: [Any]]()

anyObjectArray.forEach( {
    let key = "\([type(of: $0))"
    if map[key] == nil { map[key] = [] }
    map[key]?.append($0)
})

Или в качестве альтернативы для Swift 4.2 (или более поздней версии), как это было предложено Робом Нейпером

let map = Dictionary(grouping: anyObjectArray, by: { "\(type(of: $0))" })
0 голосов
/ 11 декабря 2018

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

anyObjectArray.sorted { "\(type(of: $0))" < "\(type(of: $1))" }

Но это очень похоже на то, что Array был неправильный тип в первую очередь.Такое ощущение, что вы действительно хотите здесь словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...