Swift создает новые массивы на основе одного массива из свойства - PullRequest
0 голосов
/ 23 октября 2018

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

Примерно так:

var arr1 = [("polly", 23, uk), ("polly", 19, canada), ("polly", 29, us), ("jenny", 78, ireland), ("jenny", 78, ireland)....]

затем, группируя все элементы с одинаковыми именами, я хочу получить следующее:

arrA = (do some code and return this) [("polly", 23, uk), ("polly", 19, canada), ("polly", 29, us)]
arrB = (do some code and return this) [("jenny", 78, ireland), ("jenny", 78, ireland)]

arrFinal = [arrA, arrB]

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

Спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

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

enum Country {
    case uk
    case canada
    case us
    case ireland
}
struct Person {
    let name : String
    let age : Int
    let country : Country
}
let arr = [
    Person(name: "polly", age: 23, country: .uk),
    Person(name: "polly", age: 19, country: .canada),
    Person(name: "polly", age: 29, country: .us),
    Person(name: "jenny", age: 78, country: .ireland),
    Person(name: "jenny", age: 78, country: .ireland),
]

А вот фактический код:

let arr2 = Array(Dictionary.init(grouping: arr) {$0.name}.values)

Чтобы сгруппировать, скажем, возраст вместо имени, измените$0.name до $0.age.

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