如何编写高阶函数,如map,filter,reduce等?

时间:2017-10-06 13:38:06

标签: swift functional-programming

我正试图以自己的方式编写或实现自己的高阶函数,但无法编写它。 在下面的代码中,我尝试编写过滤器。

    var array : [String] = ["Sagar","Harshit","Parth","Gunja","Marmik","Sachin","Saurav"]

   //Native filter function of Swift

    array = array.filter { (name) -> Bool in
        return name.prefix(1) == "S"
    }

我根据filter的方法签名实现下面的代码,但据我所知,我们不能用返回类型编写闭包(如果可能的话,我不知道)。

func filterArray(_ array : [String], completionHandler : (_ name : String) -> ()) -> (){

    for (_, value) in array.enumerated(){
        completionHandler(value)
    }
}


    self.filterArray(array) { (name) -> () in
        if name.prefix(1) != "S"{
            if let index = array.index(of: name){
                array.remove(at: index)
            }
        }
    }

我的实现工作正常并过滤数组。但我想从数组中抽象删除对象的逻辑。

我们可以编写自己的高阶函数吗? 如果是,请帮助实施上述方法。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以为闭包定义返回类型。您可以在下面找到一个工作示例,但为此我建议使用内置filter函数的Swift,它可以提供相同的解决方案,速度更快。

var array : [String] = ["Sagar","Harshit","Parth","Gunja","Marmik","Sachin","Saurav"]

func filterArray(_ array : inout [String], condition: (_ name : String) -> Bool) -> (){

    var filteredArray: [String] = []
    for value in array {
        if condition(value) {
            filteredArray.append(value)
        }
    }
    array = filteredArray
}

filterArray(&array) { (name) -> Bool in
    return !name.hasPrefix("S")
}

print(array)

您可以在集合上定义自己的高阶函数。 有一个很棒的关于集合的会话,Soroush展示了编写扩展集合的高阶函数的例子。

https://academy.realm.io/posts/try-swift-soroush-khanlou-sequence-collection/

// Swit built in filter
let numberOfAdmins = users.filter({ $0.isAdmin }).count // => fine 
// Custom "filter"
let numberOfAdmins = users.count({ $0.isAdmin }) // => great

extension Sequence {

    func count(_ shouldCount: (Iterator.Element) -> Bool) -> Int {

        var count = 0
        for element in self {
           if shouldCount(element) {
               count += 1
           }
        }
        return count
    } 
}