我碰到了一个很酷的Swift技术的例子,但没有解释它是如何工作的或它做了什么,尽管我已经编写了大量的Swift代码,但它充满了错综复杂的Swiftism,它正在扭曲我的到处走走。
如果有一个熟悉Swift的人不介意解剖它并辨别其目的,那么它将真正增加我对语言及其更强大功能的掌握,并可能启发其他人。
if exist "%~1"
答案 0 :(得分:2)
extension
到Array
类型定义了一个名为match
的新计算属性。此属性的类型为(head: T, tail: [T])?
,因此是一个可选元组,其中第一个元素(名为head
)的类型为T
,第二个元素为(名为tail
)的类型为T
的数组。 T
只是存储在数组内部的元素类型的泛型类型(因为Array
本身就是一个泛型集合)。
var match : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
如果Array不包含任何元素,则此计算属性返回nil
,或者返回包含列表的第一个元素(self[0]
和列表尾部(一切)的元组除了第一个元素):Array(self[1..<count])
。
现在该数组具有此计算属性,我们可以利用它以递归方式调用数组元素上的函数f
并返回包含这些函数调用结果的新Array
。这是map
函数的作用:
func map<A, B>(f: A -> B, arr: [A]) -> [B] {
if let (head, tail) = arr.match {
return [f(head)] + map(f, tail)
} else {
return []
}
}
映射函数f
属于type A -> B
,这意味着它将A
类型的元素映射到B
类型的元素,因此{{1必须传递一个类型为map
的数组。然后,使用[A]
变量和可选绑定,我们可以在列表match
的头部调用f
并将其放在新列表中,然后追加递归{{的结果1}}调用其余的数组元素[f(head)]
。
要了解他们试图更好地实施的地图功能: