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
和[]
之间的特定语义差异。谢谢!这就成功了。也许只是我,但没有发现错误信息非常确凿。。。