Swift 3的命名约定:字符串扩展中的句法说明

几周前,苹果发布了Swift 3.0,对2.3进行了重大改进和改进。 特别是其中一项更改是动词名词在句法上的区别,以阐明功能中结果的状态,例如:

sort()与sorted()

枚举()与枚举()

reverse()vs. reversed()

总结一下:名词以-d结尾(排序,枚举,反向)将指示对象的新实例,而动词(sort,枚举,反向)描述对对象实例本身所做的更改。

为了更好地理解这种区分可能会有所帮助的特定上下文,我以以下示例为起点。

反转字符串时,请考虑使用反转函数:

上面的代码实质上分为以下步骤:

1.将字符串类型的“单词”分解为字符。 以字符集合的形式成为String内容 视图

2.冲销货款; 现在是Reversed.Collection

3.将反向集合转换为字符串,以便将其作为新变量传递

4.返回包含反向字符串值的新变量

请注意第4点-整个过程将返回一个全新的String,该字符串与原始“单词”字符串无关。

但是,如果我想逆转单词本身怎么办?

在更改String实例时,由于String在Swift中是Struct的现有类型,因此无法访问Struct来添加新方法并更改该实例的值。 在这种特殊情况下, 扩展的使用成为String附加功能(可以更改其实例值)的唯一选择。

函数通常可以通过两种方式对实例变量进行更改:要么有一个全新的变量具有更改后的状态(该状态由函数中的返回值指定),要么可以更改实例变量本身。 当以函数语法表示时,将指定关键字“ mutating ”来描述对实例变量本身进行更改的结果。 类似地,字符串的扩展可以通过使一个函数返回新的String以及使另一个函数(“变异函数”)返回实例本身的更改状态,来在实例变量的这两种情况下扩展。

因此,如果我们以某种方式需要其他选项来更改此String的原始值,则可以编写一个扩展程序,其中包含解决两种情况的函数:

请注意,第二个函数是一个变异函数,它不返回 String,而String本身现在是反转的String。 我们可以如下测试该语句:

由于扩展名中的变异函数会更改原始String的值,因此称为reverse()的变异函数表示Swift 3中该动词描述了原始变量的更改状态。

该示例清楚地表明,语法细节可以提高语言的连贯性,并且在String的扩展中使用它可以创建一种语法选项,该选项将两种不同的结果分开:创建对象的新实例以及更改原始值。

向前发展,虽然语法上的这一新变化可能会造成暂时的混乱:例如Swift 2.2中的sort(),该函数用于返回排序后的数组; 和sortInPlace()用于对数组本身进行排序-在Swift 3中,它们现在被sorted()和sort()取代。 总而言之,Swift 3中的这种特殊性是一种优雅简洁的方式,可以促使程序员更加流利。