想帮助理解这个Swift hackery

时间:2017-01-08 10:30:58

标签: swift

我碰到了一个很酷的Swift技术的例子,但没有解释它是如何工作的或它做了什么,尽管我已经编写了大量的Swift代码,但它充满了错综复杂的Swiftism,它正在扭曲我的到处走走。

如果有一个熟悉Swift的人不介意解剖它并辨别其目的,那么它将真正增加我对语言及其更强大功能的掌握,并可能启发其他人。

if exist "%~1"

1 个答案:

答案 0 :(得分:2)

extensionArray类型定义了一个名为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)]

要了解他们试图更好地实施的地图功能:

enter image description here