Как получить доступ к словарю внутри структуры - PullRequest
0 голосов
/ 05 мая 2018

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

Это моя структура:

struct TransactionsObject: Codable {
    let UserInitiatedTransactions: [UserEdTransaction]?
    let UserReceivedTransactions: [UserEdTransaction]?

    enum CodingKeys: String, CodingKey {
        case UserInitiatedTransactions = "UserInitiatedTransactions"
        case UserReceivedTransactions = "UserReceivedTransactions"
    }
}

struct UserEdTransaction: Codable {
    let transactionCode: Int?
    let transactionDate: String?
    let transactionType: String?
    let transactionTime: String?
    let transactionAmount: String?
    let transactionTo: String?
    let transactionFrom: String?

    enum CodingKeys: String, CodingKey {
        case transactionCode = "transactionCode"
        case transactionDate = "transactionDate"
        case transactionType = "transactionType"
        case transactionTime = "transactionTime"
        case transactionAmount = "transactionAmount"
        case transactionTo = "transactionTo"
        case transactionFrom = "transactionFrom"
    }
}

Я хотел бы получить доступ к этому Код транзакции . Я пробовал это в TransactionsObject.UserInitiatedTransactions.transactionCode, и я получаю следующую ошибку:

Value of type '[UserEdTransaction]?' has no member 'transactionCode'

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Прежде всего вопрос должен быть Как получить доступ к массиву внутри структуры ?

Во-вторых, используйте CodingKeys, только если члены структуры и ключи не совпадают, например, с lowerCamelCase именами переменных.

Треть всех объявляет необязательными только члены структур, чьи ключевые эквиваленты могут отсутствовать

struct TransactionsObject: Codable {
    let userInitiatedTransactions: [UserEdTransaction]
    let userReceivedTransactions: [UserEdTransaction]

    enum CodingKeys: String, CodingKey {
        case userInitiatedTransactions = "UserInitiatedTransactions"
        case userReceivedTransactions = "UserReceivedTransactions"
    }
}

struct UserEdTransaction: Codable { // no CodingKeys !!
    let transactionCode: Int
    let transactionDate: String
    let transactionType: String
    let transactionTime: String
    let transactionAmount: String
    let transactionTo: String
    let transactionFrom: String
}

Ошибка возникает из-за того, что userInitiatedTransactions является массивом. Вам нужна подписка на индекс

print(transactionsObject.userInitiatedTransactions[0]) // can crash if the array is empty

или повторный цикл

for transaction in transactionsObject.userInitiatedTransactions {
    print(transaction.transactionCode)
}
0 голосов
/ 05 мая 2018

Вы обращаетесь к array как объект UserEdTransaction, поэтому вам нужно получить объект из массива, а затем использовать, как показано ниже:

TransactionsObject.UserInitiatedTransactions.first.transactionCode

или

TransactionsObject.UserInitiatedTransactions[0].transactionCode

или

TransactionsObject.UserInitiatedTransactions.forEach { (object) in
            print(object.transactionCode)
        }
0 голосов
/ 05 мая 2018

У вас нет словаря. UserInitiatedTransactions это массив. Массивы не имеют transactionCode s, но элемент вашего массива имеет.

Теперь возникает вопрос, какой код транзакции транзакции вы хотите?

Если вы хотите первый, вы можете сделать это:

someTransactionsObject.UserInitiatedTransactions.first?.transactionCode

Если вы хотите четвертый,

someTransactionsObject.UserInitiatedTransactions[3].transactionCode

Если вы хотите nth,

someTransactionsObject.UserInitiatedTransactions[n-1].transactionCode

Или вы можете получить массив кодов транзакций:

someTransactionsObject.UserInitiatedTransactions.map { $0.transactionCode }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...