Tag: 标准库

了解Swift写时复制机制

在Swift中,我们有引用类型(类)和值类型(结构,元组,枚举)。 值类型具有复制语义。 这意味着,如果您为变量分配值类型或将其作为参数传递给函数(除非它是inout参数),则将复制该值的基础数据。 您将拥有两个具有相同内容的值,但是分配在两个不同的内存地址中。 有关Apple博客上引用类型和值类型之间差异的更详细说明。 由于我们将要讨论写时复制,因此了解Swift值语义非常重要。 所以……开始吧 什么是写时复制? 在Swift中,当您具有较大的值类型并且必须将参数分配或作为参数传递给函数时,就性能而言,将其复制可能会非常昂贵,因为您必须将所有基础数​​据复制到内存中的另一个位置。 为了将问题最小化,Swift Standard库为某些值类型(例如Array)实现了这套机制,其中值仅在发生突变时才复制,即使在该值具有多个引用的情况下也才复制,因为如果该值是唯一引用的,不需要复制,可以在引用上进行更改。 因此,仅分配给变量或将Array传递给函数并不一定意味着它将被复制,并且确实可以提高性能。 真正重要的是要知道的是… 写时复制不是值类型的默认行为,它是在Swift标准库中针对某些类型(例如数组和集合)实施的。 因此,这意味着并非标准库中的每个值类型都具有此行为。 此外,除非您自己实现它,否则您创建的值类型没有它。 这是我将在下一节稍后讨论的内容。 让我们在实践中看一个例子: 这就是本文的全部,希望您喜欢🙂 如果您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback 您可以在Twitter上@ LucianoPassos11找到我。 感谢您阅读🙂

每次调用的结果均调用n次

您可以在我的博客上阅读此帖子–>>> 此处 今天,我在Sash Zats的一条推文中遇到了这个问题:一个函数如何调用n次,并使用每个调用的参数作为上次调用的结果? 当然,假设我们要调用一个函数5次,则可以这样做: ///Adds 5 to a number func addFive(to number: Int) -> Int { return number + 5 } let result = addFive(to: addFive(to: addFive(to: addFive(to: addFive(to: 2))))) print(result) //27 但这就是我们真正想要写的吗? 救援标准图书馆 我做了一些研究,然后发现了Chris Eidhof的回应,其中提到了一种叫做UnfoldSequence的类型。 事实证明,标准库具有一个名为sequence(first:next:)的函数,可以执行此操作。 从文档中: 返回由next和first重复懒惰应用形成的序列。 为了完整起见,下面是整个函数签名: /// – Parameter first: The first element to be returned from the sequence. /// […]