具有可用初始化的数组变换

时间:2015-05-05 12:49:45

标签: swift

我在Xcode 6.3.1中使用Swift 1.2 以下是我的Person结构

struct Person {
    let age: Int
    init?(age: Int) {                   //Failable init
        if age > 100 { return nil }
        self.age = age
    }
}

我有一个年龄列表,我必须制作人物对象。

我制作了游乐场文件。

let arr = Array(1...150) //Sample set of ages against which Person is created
var personList: [Person]!

personList = arr.map({ (val: Int) -> Person? in
    return Person(age: val)        //Makes object of type Person?
}).filter {
    $0 != nil
}.map {
    return $0!
}

这里我使用了map - filter - map,因为第一个地图调用了可用的初始化器(因此返回Person?)而personList的类型为[Person]。 因此第二个函数过滤所有非零对象和第三个图强制打开到可选的人工制作人?对人。

有更容易/可读的方法吗?链接map-filter-map肯定对这个

来说太过分了

3 个答案:

答案 0 :(得分:3)

注意:这个答案是针对当前的Swift 1.2给出的 问题发布时的版本。由于Swift 2有更好的解决方案,请参阅@ Jeremie的回答。

我不知道组合filter()的内置函数 和map()。您可以使用更紧凑的代码编写代码 所有闭包中的简写参数$0

let personList = arr.map { Person(age: $0) }
    .filter { $0 != nil }
    .map { $0! }

当然,您可以定义自己的扩展方法来映射 数组元素并只保留非零结果:

extension Array {
    func optmap<U>(transform: T -> U?) -> [U] {
        var result : [U] = []
        for elem in self {
            if let mapped = transform(elem) {
                result.append(mapped)
            }
        }
        return result
    }
}

然后将其用作

let personList = arr.optmap { Person(age: $0) }

答案 1 :(得分:3)

你可以使用flatMap去除数组中的任何nils,this tutorial讨论方法的长度,但以下方法效果最好:

let personList = arr.flatMap { Person(age: $0) }

答案 2 :(得分:0)

在这种情况下,您可以使用compactMap优于flatMap来删除数组中的所有nil:

let personList = arr.compactMap { Person(age: $0) }

Swift document声明:

  

返回一个数组,该数组包含调用给定结果的非nil结果   对该序列的每个元素进行转换。