You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问Swift结构体内部的字典?附Codable结构体代码示例

嘿,看起来你是想访问TransactionsObject里的交易列表内容对吧?先纠正个小细节:你代码里的UserInitiatedTransactions和UserReceivedTransactions是可选数组类型([UserEdTransaction]?),不是字典哦~不过没关系,我来一步步教你怎么安全地访问这些内容:

步骤1:补全并确认结构体定义

首先先补全UserEdTransaction的完整结构(假设你原本的代码没写完),这样后续访问属性才有依据:

struct UserEdTransaction: Codable {
    let transactionId: String
    let amount: Double
    let sender: String?
    let recipient: String?
    // 这里可以添加你需要的其他字段
}

// 你的TransactionsObject可以简化(CodingKeys和属性名完全一致时,无需显式声明)
struct TransactionsObject: Codable { 
    let UserInitiatedTransactions: [UserEdTransaction]? 
    let UserReceivedTransactions: [UserEdTransaction]? 
}
步骤2:获取TransactionsObject实例

你需要先有一个TransactionsObject的实例,要么是从JSON解析来的(因为它遵循Codable),要么手动创建测试用例:

// 手动创建测试实例
let testTransaction = UserEdTransaction(
    transactionId: "TX_001",
    amount: 100.5,
    sender: "Bob",
    recipient: "You"
)
let transactions = TransactionsObject(
    UserInitiatedTransactions: [testTransaction],
    UserReceivedTransactions: nil
)
步骤3:安全访问数组内容

因为两个交易数组是可选类型(带?),直接访问会有崩溃风险,推荐用以下几种方式处理:

方式一:if let 可选绑定(最常用)

// 访问用户发起的交易
if let initiatedTransactions = transactions.UserInitiatedTransactions {
    // 这里initiatedTransactions是非可选的数组,可直接遍历
    for tx in initiatedTransactions {
        print("发起的交易ID:\(tx.transactionId)")
        print("交易金额:\(tx.amount)")
        if let sender = tx.sender {
            print("付款方:\(sender)")
        }
    }
} else {
    print("没有用户发起的交易记录")
}

// 同理访问用户收到的交易
if let receivedTransactions = transactions.UserReceivedTransactions {
    for tx in receivedTransactions {
        print("收到的交易ID:\(tx.transactionId)")
        print("收款金额:\(tx.amount)")
    }
}

方式二:guard let 提前退出(适合函数内使用)

如果在函数里处理,用guard let可以让逻辑更清晰:

func printReceivedTransactions(from obj: TransactionsObject) {
    guard let receivedTx = obj.UserReceivedTransactions else {
        print("无收款交易记录")
        return
    }
    for tx in receivedTx {
        print("收款交易ID:\(tx.transactionId),金额:\(tx.amount)")
    }
}

printReceivedTransactions(from: transactions)

方式三:空合运算符(默认空数组)

如果想直接用空数组作为默认值,避免可选判断,可以用??:

let allInitiatedTx = transactions.UserInitiatedTransactions ?? []
for tx in allInitiatedTx {
    print(tx.transactionId)
}

内容的提问来源于stack exchange,提问作者Erent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:32:03