前几天,一个朋友在微博上通过私信问了我一个问题,如下的代码,为什么变量crr没能把值为 nil 的元素过滤掉?let arr:[Int?] = [1, 2, 3, nil, 4, 5]
let brr = arr.flatMap { $0 }
brr
// brr = [1, 2, 3, 4, 5]
let crr:[Int?] = arr.flatMap { $0 }
crr
// crr = [{Some 1}, {Some 2}, {Some 3}, nil, {Some 4}, {Some 5}]简单来看,同样是使用flatMap函数,brr 变量成功过滤掉了值为 nil 的元素,变量 crr 过滤失败。而 brr 和 crr 的区别就是它们的类型不一样,brr 的类型是[Int],而 crr 的类型是[Int?],想必其中原因与此有关,那到底是为什么呢?在和一些朋友讨论之后,我大概想明白了,这和类型推断有关系。在 crr 相关的代码中,因为 crr 的类型已经被程序员指定为[Int?],所以为了编译通过,编译器需要推断出flatMap中的闭包的输入和输出变量类型。我们回顾一下f
...
继续阅读
(83)