我正试图以自己的方式编写或实现自己的高阶函数,但无法编写它。 在下面的代码中,我尝试编写过滤器。
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)
}
}
}
我的实现工作正常并过滤数组。但我想从数组中抽象删除对象的逻辑。
我们可以编写自己的高阶函数吗? 如果是,请帮助实施上述方法。 提前谢谢。
答案 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
}
}