сопоставить массив структуры - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть массив struct, содержащий несколько полей.Я хочу отобразить массив, чтобы создать еще одну структуру, содержащую подмножество полей

struct History: {
   let field1: String
   let field2: String
   let field3: String
   let field4: String
}

struct SubHistory: {
   let field1: String
   let field2: String
}

Я мог бы использовать цикл for in.Но может быть возможно использовать карту, нет?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

В качестве небольшого отклонения от правильного ответа kiwisip : я бы предложил поместить логику «создания подистории из истории» в пользовательский инициализатор:

extension SubHistory {
    init(history: History) {
        self.init(field1: history.field1, field2: history.field2)
    }
}

ЗатемСопоставление может быть просто выполнено как

let histories: [History] = ...
let subHistories = histories.map(SubHistory.init)

Преимущество помещения инициализатора в расширение заключается в том, что по умолчанию для каждого элемента инициализируется элементный инициализатор - атрибуция для этого наблюдения переходит к @kiwisip!

0 голосов
/ 21 апреля 2019

Да, когда у вас есть Array или любой тип, реализующий протокол Collection, где map определено , вы можете использовать map для преобразования[A] в [B].

kiwisip уже дал хороший ответ, и Martin R предложил хороший вариант.

Вот еще один.

extension History {

  var subHistory: SubHistory { 
    return SubHistory(field1: field1, field2: field2)
  }
}

// use it like
let histories: [History] = [...]
let subHistories = histories.map { $0.subHistory }
0 голосов
/ 21 февраля 2019

Да, вы можете использовать map следующим образом:

let histories: [History] // array of History structs
let subHistories = histories.map { SubHistory(field1: $0.field1, field2: $0.field2) }
...