Swift中映射对象数组的问题

Swift中映射对象数组的问题,swift,mapping,Swift,Mapping,我有以下两个类/结构: 类会话详细信息{ var消息:[ChatMessage]? var参与者:[用户]? } 类用户:可编码{ 初始化(电子邮件:字符串){ self.email=电子邮件 } //系统 变量id:字符串? var验证帐户:Int? var拒绝:Int? ... } 我进一步得到了var conversationDetails=conversationDetails(),并用一个API调用填充它。一切正常 我想映射conversationDetails中的参与者数组,并访问

我有以下两个类/结构:

类会话详细信息{
var消息:[ChatMessage]?
var参与者:[用户]?
}
类用户:可编码{
初始化(电子邮件:字符串){
self.email=电子邮件
}
//系统
变量id:字符串?
var验证帐户:Int?
var拒绝:Int?
...
}
我进一步得到了
var conversationDetails=conversationDetails()
,并用一个API调用填充它。一切正常

我想映射
conversationDetails
中的参与者数组,并访问每个参与者的id属性,如下所示:

让recipient_id=self.conversationDetails.participants.map({(participant)->输入字符串
返回参与者id
})
在我的理解中,map迭代整个参与者数组,这是一个用户对象数组,我可以通过
participant
访问每个项目。 但是,我得到的“[User]”类型的
值没有
返回参与者.id的成员“id”


我的误解在哪里?

您的
参与者
var是可选的,所以您需要在访问数组中添加问号。如果没有它,您将尝试调用可选的
map

这是工作代码:

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

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

此外,您还可以使用
compactMap
recipientIds
数组中删除nil,并使用
[String]
数组代替
[String?]


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

第一个问题是
participants
是可选的,因此您需要添加一个?当访问它时

conversationDetails.participants?
然后在映射时,您应该使用
compactMap
,因为
id
也是一个可选属性

let recipient_ids = conversationDetails.participants?.compactMap { $0.id }
另一个变体是没有可选数组,而是将其初始化为空数组。这实际上是处理集合属性的一种更好的方法,因为您可以通过将它们初始化为空集合来获得更干净的代码

var participants = [User]()
然后呢

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

您可能不应该在此处使用可选数组,除非您想保留
nil
[]
之间的特定语义差异。谢谢!这就成功了。也许只是我,但没有发现错误信息非常确凿。。。