2017-10-06 38 views
0

我想用自己的方式编写或实现自己的高阶函数,但无法编写它。 在下面的代码中,我尝试写入过滤器。如何编写地图,过滤器,缩小等高阶函数?

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

而且你可以定义一个返回类型到闭包。你可以在下面找到一个工作示例,但为此我建议使用内置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 
    } 
} 
+0

你为什么枚举阵列和丢弃的索引值我会检查这个视频来了解详情 – technerd

+1

?这个不成立。 '用于数组中的值{' –

+1

另外String有一个名为hasPrefix的方法。 'name.prefix(1)!=“S”'你应该把它改为'!name.hasPrefix(“S”)' –