如何将自定义对象数组的数组[ [CustomModel?]] 扁平化?

4

我只具备基础的 Swift 知识。

我想将 var dataSource:[[CustomModel?]]? 改为 [CustomModel]

我尝试了以下方法:

  1. let flat = dataSource.reduce([],+)
  2. let flat = dataSource.flatMap { $0 }
  3. let flat = dataSource.compactMap{ $0 }
  4. let flat = Array(dataSource.joined())

但是我遇到了错误:

无法将类型为 '[FlattenSequence<[[CustomModel?]]>.Element]'(也称为 'Array<Optional< CustomModel >>')的值转换为预期的参数类型 '[CustomModel]'


你不能更改同一变量的类型,必须创建另一个变量。 - Shehata Gamal
尝试以下答案,但请注意它尚未编译。 - Shehata Gamal
reduceflatMapcompactMap 返回一个值,如果你不将它分配给另一个变量,那么你的前三行代码就是无用的。 - Shehata Gamal
@Sh_Khan,我已经编辑了问题,请看一下。 - Anees
以下是答案,请检查。 - Shehata Gamal
2个回答

5

您需要使用flatMap{}将嵌套的数组变平,然后使用compactMap{}获取非可选值。假定输入数组为[[Int?]]。

let value:[Int] = dataSource.flatMap{$0}.compactMap{ $0 } //Correct

另一个选项会出错。
let value:[Int] = dataSource.flatMap{ $0 } ?? [] //Error

//正确 在此输入图片描述

//错误 在此输入图片描述


3

您可以尝试

var arr:[CustomModel] = dataSource?.flatMap { $0 } ?? [] 

此外

var arr:[CustomModel] = dataSource?.flatMap { $0 }.compactMap{ $0 } ?? [] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接