![v2-a473fba6a7dc9a0880b5070ae3e42ff6_1440w.jpg?source=172ae18b](http://img-03.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-a473fba6a7dc9a0880b5070ae3e42ff6_1440w.jpg?source=172ae18b)
我喜欢阅读简短而富有表现力的代码。由于开发人员比编写代码花费更多的时间来阅读代码,因此表达性通常是强制性的。
除非简短不会掩盖意图,否则我宁愿使用简洁的表述,也不愿使用简短的表述。例如:
![v2-a41f382c0b2758c0ab1190cd75b7d6a8_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-a41f382c0b2758c0ab1190cd75b7d6a8_b.jpg)
该示例显示了2个连接字符串的选项:使用加法运算符+
或appending(_)
字符串方法。
您更喜欢哪种选择?我想简明扼要greeting + who
。
Swift中的运算符重载使得可以编写短表达式。许多类型的喜欢Int
,String
,Array
过载除了(+
)和加法赋值(+=
)运算符。它使相应类型的操作更加直观。
您想编写表达性代码吗?我确定你会的!因此,让我们继续一个有趣的类型列表,这些类型支持for +
和的运算符重载+=
。
为了比较,还介绍了具有相同行为的替代方法。
1.总数
显然,加法运算符的常规用法是要对数字进行算术加法。例如,4 + 8
被评估为12
。
由于Swift是类型安全的,因此当两个操作数完全相同的类型(,但不是或)时,您可以应用+
和+=
运算符。 Int + IntUInt + IntFloat + Int
所有SWIFT号码类型Int
,Float
,Double
和其他支持加法运算。让我们看一个示例:
![v2-d89cc9fc489c0582cee0af759b753a17_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d89cc9fc489c0582cee0af759b753a17_b.jpg)
x + y
执行两个整数的算术加法。干净利落。
该表达式通过将变量附加到变量上来对其进行x += y
突变(与相同)。在此操作期间发生了突变,因此必须使用将其声明为变量。 xyx = x + yxvar
加法运算符的等效方法是adding(_:)
和mutating add(_:)
。这些方法适用于Float
和Double
,但不适用于Int
。
让我们看看它们的作用:
![v2-e1b13ef593dbe4e77f4814dc43cfee39_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-e1b13ef593dbe4e77f4814dc43cfee39_b.jpg)
p
和r
有Double
型。
的调用p.adding(r)
与相同p + r
。分别p.add(r)
突变p
并等同于p += r
。
2.连接字符串
加法和加法赋值运算符可以执行字符串连接。例如,"abc" + "def"
创建一个字符串"abcdef"
。
让我们来看一个例子:
![v2-443e67dacc199f4061caa23c9768aa5c_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-443e67dacc199f4061caa23c9768aa5c_b.jpg)
message + name
连接两个字符串。
该语句message += name
还执行串联。它message
通过附加到其结尾name
字符串进行修改。
您还可以使用等效的方法appending(_:)
和mutating append(_:)
,它们比较冗长。让我们转换上面的示例:
![v2-7c0ad065c6b2478ee0661540369df794_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-7c0ad065c6b2478ee0661540369df794_b.jpg)
调用将message.appending(name)
连接message
和name
,并返回结果。message
变量未修改。
调用message.append(name)
正在使message
变量变异并附加到其结束name
字符串。
3.串联数组
加法运算符对于连接数组很有用。[val1, val2] + [val3]
创建[val1, val2, val3]
。
串联数组必须具有相同类型的元素。
![v2-8691ec3ab1a10f055e5d2f7d5ad8a0b5_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-8691ec3ab1a10f055e5d2f7d5ad8a0b5_b.jpg)
该表达式colors + darkColors
创建一个新数组,其中包含from元素,colors
然后包含from 元素darkColors
。通过将的尾部元素添加到,colors += darkColors
将colors
数组更改为适当位置darkColors
。
另外,您可以使用mutating append(contentsOf:_)
,它等效于加法赋值运算符(+=
)。转换上面的示例:
![v2-66b0c0a04e4d21a9c2634d8c8c0260a2_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-66b0c0a04e4d21a9c2634d8c8c0260a2_b.jpg)
的调用就位colors.append(contentsOf: darkColors)
修改colors
并附加的元素darkColors
。
4.将时间间隔添加到日期
加法运算符可以表达性地将间隔添加到Date
。该表达式将date + timeInterval
创建一个新的表达式,Date
并添加指定的时间量。添加任务会修改日期date += timeInterval
。
让我们看看如何做到这一点:
![v2-38fdd01cda12ec22ee970bbacc9890bc_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-38fdd01cda12ec22ee970bbacc9890bc_b.jpg)
oneDay
是一个间隔,其中包含24小时内的秒数。dateFormatter
为创建日期2017-02-15
。
表达式date + oneDay
的计算结果为一个新的日期dayAfterDate
是从创建date
与oneDay
时间间隔添加到它。
如果要date
直接修改,请使其为变量,然后使用附加赋值运算符+=
:
![v2-2acb9a65e37c4a5ed75c8932cf3ddfae_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-2acb9a65e37c4a5ed75c8932cf3ddfae_b.jpg)
date =+ oneDaydate
通过添加oneDay
几秒钟来进行变异。
Date
提供相同行为的方法是addingTimeInterval(_:)
和mutating addTimeInterval(_:)
。
关于日历的提示
提供的修改日期的方式可调整绝对值。添加更长的时间间隔(例如数周或数月)时,您可能会得到意外的结果。
在大多数情况下,Calendar
使用是可取的。它可以根据夏时制,不同天数的月份等提供准确的日期修改。
让我们更新上面的示例,并使用一个日历实例Calendar.current
:
![v2-9e0637eea225544c2d295c74ed80f0e6_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9e0637eea225544c2d295c74ed80f0e6_b.jpg)
5.总和测量
基金会最近的更新引入了测量和单位。它允许代表距离(例如10 miles
,12 kilometers
),重量(8 kg
)等等。
好的部分是Measurement
结构重载了+
运算符(以及* - / < ==
)。这使测量操作变得简单明了。
让我们总结两个公里数的距离:
![v2-4fd101e901463aa24704cd17a356b037_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-4fd101e901463aa24704cd17a356b037_b.jpg)
morningRun
并eveningRun
描述某人早上和晚上跑步的距离。
简单而简单的加法运算符用于查找每日跑步距离:morningRun + eveningRun
。
加法运算必须相加描述相同类型的物理单位(长度,质量,速度和测量更多)。
例如,将速度和质量值相加是没有意义的。在这种情况下,Swift会触发错误:
![v2-8e0cc5869e0b310066a48599b63c99f9_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-8e0cc5869e0b310066a48599b63c99f9_b.jpg)
turtleSpeed
和turtleWeight
是保存不同类型单位的度量:UnitLength.kilometers
和UnitMass.grams
。它们不兼容,因此Swift会触发错误。
Measurement
结构不提供操纵方法。在这种情况下,您仅需使用运算符。
在我看来,这是一个不错的决定,因为操作员非常适合进行测量。
六,结论
如图所示,加法和加法赋值运算符提供了简洁的语法。
通常,这些用于对数字求和并连接字符串。
连接数组,处理日期和总和测量时,还可以从简洁的语法中受益。
原著作者:德米特里·帕夫鲁汀
文章来源:国外
原著链接:
Dmitri Pavlutin Blogdmitripavlutin.com![v2-b9982406b5748fc7a5f0a51ce00e670f_ipico.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=f4039380-f02e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-b9982406b5748fc7a5f0a51ce00e670f_ipico.jpg)
PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。