gpt4 book ai didi

swift - 想帮助理解这个 Swift 黑客

转载 作者:搜寻专家 更新时间:2023-11-01 07:17:11 26 4
gpt4 key购买 nike

我遇到了这个很酷的 Swift 技术的例子,但没有解释它是如何工作的或者它做了什么,尽管我已经写了相当多的 Swift 代码,但它充满了错综复杂的 Swiftisms,它目前正在扭曲我的转过头去。

如果有足够精通 Swift 的人不介意剖析它并辨别它的目的,那真的会增加我对这门语言及其更强大功能的掌握,并且可能也会启发其他人。

extension Array {
var match : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
}

func map<A, B>(f: A -> B, arr: [A]) -> [B] {
if let (head, tail) = arr.match {
return [f(head)] + map(f, tail)
} else {
return []
}
}

最佳答案

extensionArray type 定义了一个名为 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
}

此计算属性要么返回 nil ,如果 Array 不包含任何元素,或者它返回一个元组,其中包含列表的第一个元素( 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 的元素,因此 map必须传递类型为 [A] 的数组.然后,使用 match我们可以调用变量和可选绑定(bind) f在榜首[f(head)]并将其放入新列表中,然后附加递归 map 的结果调用其余的数组元素 map(f, tail) .

为了更好地理解他们试图实现的 map 功能:

enter image description here

关于swift - 想帮助理解这个 Swift 黑客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531715/

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