gpt4 book ai didi

swift - find() 使用函数式编程

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:28 25 4
gpt4 key购买 nike

我想创建一个通常用于函数式编程的通用 find()。在函数式编程中,您不使用数组索引和 for 循环。你过滤。它的工作方式是,如果你有一个 say 的列表

["apple", "banana", "cherry"] 

你想找到香蕉,然后你通过创建元组将数组索引分配给列表元素

[(1, "apple"), (2, "banana"), (3, "cherry")] 

现在您可以向下过滤到“banana”并返回索引值。

我试图为此创建一个通用函数,但出现错误。这个语法有什么问题?

func findInGenericIndexedList<T>(indexedList: [(index: Int, value: T)], element: (index: Int, value: T)) -> Int? {        
let found = indexedList.filter { // ERROR: Cannot invoke 'filter' with an argument list of type '((_) -> _)'

element.value === $0.value
}

if let definiteFound = found.first {
return definiteFound.index
}
return nil
}

更新 1:我想使用上述解决方案而不是使用 find()(将被弃用)或在 Swift 2.0 indexOf() 中,因为我正在尝试遵循函数式编程范式,依赖于通用函数而不是类方法。

最佳答案

使这项工作所需的最小更改是使 T 符合 Equatable 并使用 == 运算符。

func findInGenericIndexedList<T:Equatable>(indexedList: [(index: Int, value: T)], element: (index: Int, value: T)) -> Int? {
let found = indexedList.filter {
element.value == $0.value
}

if let definiteFound = found.first {
return definiteFound.index
}
return nil
}

在这里使用 === 没有任何意义,因为通常会将其应用于值类型(尤其是如果您遵循函数式范例),而这永远不会成立。

除此之外,我还花了一些时间思考这个问题,下面是我会做的事情:

extension Array where Element : Equatable {
func find(element:Array.Generator.Element) -> Int? {
let indexedList = lazy(self.enumerate())
let found = indexedList.filter {
element == $1
}

let definiteFound = found.prefix(1)
return definiteFound.generate().next()?.index
}
}

Array 上的协议(protocol)扩展,因为它使语法更简洁,惰性序列避免检查每个元素,0 索引。

关于swift - find() 使用函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com