Проблема с отображением массива объектов в Swift - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующие 2 класса / структуры:

class ConversationDetails {

    var messages: [ChatMessage]?
    var participants: [User]?
}

class User: Codable {

    init (email: String) {
        self.email = email
    }

    // system
    var id: String?
    var verifiedaccount: Int?
    var rejected: Int?
    ...
}

У меня также есть var conversationDetails = ConversationDetails (), и я заполняю его вызовом API. Все это прекрасно работает.

Я хотел бы отобразить массив участников в conversationDetails и получить доступ к свойству id каждого участника следующим образом:

let recipient_ids = self.conversationDetails.participants.map( { (participant) -> String in
           return participant.id
        })

В моем понимании, карта повторяется по всему массиву участников, который является массивом пользовательских объектов, и я могу получить доступ к каждому элементу через participant. Однако я получаю Value of type '[User]' has no member 'id' за return participant.id.

Где мое недоразумение?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Первая проблема в том, что participants является необязательным, поэтому вам нужно добавить? при обращении к нему

conversationDetails.participants?

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

let recipient_ids = conversationDetails.participants?.compactMap { $0.id }

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

var participants = [User]()

, а затем выполните

let recipient_ids = conversationDetails.participants.compactMap { $0.id }
0 голосов
/ 28 января 2020

Ваш participants var является необязательным, поэтому вам нужно добавить знак вопроса для доступа к массиву. Без него вы пытаетесь вызвать map по желанию.

Это рабочий код:

let recipientIds = conversationDetails.participants?.map( { (participant) -> String in
    return participant.id
})

или короче:

let recipientIds = conversationDetails.participants?.map { $0.id }

Кроме того, вы можете использовать compactMap для удаления nils из массива recipientIds и иметь массив [String] вместо [String?]:

let recipientIds = conversationDetails.participants?.compactMap { $0.id }

...