Swift 如何从[(字符串?,[contact])()获取联系人数组?

Swift 如何从[(字符串?,[contact])()获取联系人数组?,swift,Swift,我有var contacts=[String?,[Contact]]我需要提取所有联系人数组,将其放入var filteredContacts=[Contact]中,以便在搜索逻辑中使用。 更新帐户和帐户对象 //帐目 struct Account: Codable { var id, displayName:String var contacts: [Contact]? ... } //帐目 struct Accounts: Codable { let account

我有var contacts=[String?,[Contact]]我需要提取所有联系人数组,将其放入var filteredContacts=[Contact]中,以便在搜索逻辑中使用。 更新帐户和帐户对象 //帐目

struct Account: Codable {
    var id, displayName:String
    var contacts: [Contact]?
...
}
//帐目

struct Accounts: Codable {
    let accounts: [Account]
...
}


        switch result {
        case .success(let result):
            
            self.accounts = result.accounts
            self.contacts  = Array(result.accounts
                .compactMap { account in account.contacts.map { (account.displayName , $0) } }.dropFirst())
            self.filteredContacts = ??
您只需使用flatMap并使用元组的第二个元素作为键路径:

您只需使用flatMap并使用元组的第二个元素作为键路径:

使用简单的

contacts.forEach({
     self.filteredContacts.append(contentsOf: $0.1)
})
使用简单的

contacts.forEach({
     self.filteredContacts.append(contentsOf: $0.1)
})

派对有点晚,但如果你想直接使用accounts或result.accounts,你可以这样做

self.filteredContacts = Array(result.accounts.compactMap(\.contacts).joined())

派对有点晚,但如果你想直接使用accounts或result.accounts,你可以这样做

self.filteredContacts = Array(result.accounts.compactMap(\.contacts).joined())

result.accounts的类型是什么?看起来从它开始可能更容易。@JoakimDanielson看到更新了吗?它们是自定义对象result.accounts的类型是什么?看起来从它开始可能更容易。@JoakimDanielson看到更新了吗?它们是自定义对象,因为Swift 3可以使用$1而不是$0.1。顺便说一句,为什么不简单的平面图呢?平面图是更好的一个,从那时起速度就慢了,但只是没有什么特别的东西,以防flapmap不清楚,应该是b。我确信它不比附加慢。这正是你应该如何使用它。顺便说一句,Om+nflatMap的实现方式也可以是预先扫描结果以查看其总数,预先分配该数量,然后复制所有内容。我记得我曾尝试过这种性能优化,虽然IIRC,但它不值得为大量输入而做。但从原则上讲,对于某些输入类型,智能实现可能会走上一条快速的道路。由于Swift 3,您可以使用$1而不是$0.1。顺便说一句,为什么不简单的平面图呢?平面图是更好的一个,从那时起速度就慢了,但只是没有什么特别的东西,以防flapmap不清楚,应该是b。我确信它不比附加慢。这正是你应该如何使用它。顺便说一句,Om+nflatMap的实现方式也可以是预先扫描结果以查看其总数,预先分配该数量,然后复制所有内容。我记得我曾尝试过这种性能优化,虽然IIRC,但它不值得为大量输入而做。但从原则上讲,智能实现可能会对某些输入类型产生快速影响。为什么不简单地将compactMap\.contacts.flatMap{$0}加入并初始化一个新数组?另一个首选选项是使用空数组初始化contacts属性,并将其声明更改为非可选。然后我们可以简单地使用result.accounts.flatMap\.contacts为什么不简单地使用compactMap\.contacts.flatMap{$0}而不是加入并初始化一个新数组?另一个首选选项是使用空数组初始化contacts属性,并将其声明更改为非可选。然后我们可以简单地使用result.accounts.flatMap\.contacts