服务器之家

服务器之家 > 正文

Swift实现“或”操作符的3种方法示例

时间:2021-01-13 16:44     来源/作者:悟饭哪

前言

我在看喵神的书的时候,发现书中有个练习(如下图),我觉得挺有意思,就把其中的“||”操作符实现了一下,跟大家分享一下。

Swift实现“或”操作符的3种方法示例

使用Swift实现“||”操作符,我发现有三种方式,各自特点如下:

  • 第一种:普通方式
  • 第二种:性能优化
  • 第三种:性能优化+写法优雅

“||”操作符,其实就是比较其左右两侧的值。所以我先定义一个常量vLeft代表左侧的值。因为右侧的值比较特殊,所以我定义了一个返回值为Bool值的函数getRightRes来获取右侧的值,代码如下:

?
1
2
3
4
5
6
let vLeft = 31 > 12 // 代表操作符左侧的值
 // 代表操作符右侧的值
func getRightRes() -> Bool {
 print("getting the right value...")
 return 2 < 10
}

第一种:

这是最普通,也是最容易想到的方式。函数有两个Bool类型的参数,value1为true是直接返回true,value1为false时,再判断value2的值。代码如下:

?
1
2
3
4
5
6
7
8
9
10
func or(_ value1: Bool, _ value2: Bool) -> Bool {
  if value1 {
    return true
  }
  if value2 {
    return true
  }
  
  return false
}

然后使用定义好的值调用一下:

?
1
2
let res = or(vLeft, getRightRes())
print("or: \(res)\n")

打印结果为:

getting the right value...
or: true

大家有没有发现一个问题,即使我左侧的值vLeft为true了,获取右侧值的函数getRightRes依然被执行了。试想如果右侧函数是个比较消耗性能费时的操作,在已经确定结果为true的情况下,再去执行右侧函数,则非常没有必要了!

那有没有办法解决这个问题呢?当然有,请看第二种方式。

第二种:

这种方式使用了闭包的概念。函数的第一个参数还是Bool类型的值,但第二个参数改为了一个返回值为Bool类型的闭包。(我们会把getRightRes函数放在闭包中执行)代码如下:

?
1
2
3
4
5
6
func or(_ value1: Bool, _ value2: () -> Bool) -> Bool {
  if value1 {
    return true
  }
  return value2()
}

这段代码的意思就是,如果value1为true直接返回true,如果value1为false,则返回value2闭包的返回值。

这个函数的调用如下:

?
1
2
3
4
let res = or(vLeft) { () -> Bool in
  return getRightRes()
}
print("or: \(res)\n")

执行结果如下:

or: true

大家发现没有,在vLeft为true的情况下,并没有再去调用getRightRes函数。这就解决了第一种方式中存在的问题。
现在我们把vLeft的值改为let vLeft = 3 > 12,再次运行代码,会发现结果如下:

getting the right value...
or: true

这就说明,在左侧值value1为false的情况时,会执行value2的闭包,闭包中的函数getRightRes会被执行,并返回结果。
这个函数的调用方式还可以简写为如下方式:

?
1
2
3
let res = or(vLeft) {
  getRightRes()
}

第三种:

这种方式只是在第二种方式的写法上进行了优化,即在闭包参数的前面加了@autoclosure关键字,作用就是在调用这个函数的时候,写法非常优雅,你甚至都感受不到闭包的存在!代码如下:

?
1
2
3
4
5
6
func or(_ value1: Bool, _ value2: @autoclosure() -> Bool) -> Bool {
  if value1 {
    return true
  }
  return value2()
}

调用代码:

?
1
2
let res = or(vLeft, getRightRes())
print("or: \(res)\n")

运行结果是跟第二种方式是一样的,但写法上比第二种简洁了很多。跟第一种普通方式的调用代码竟然是一模一样的。
以上就是我总结的使用Swift实现“或”操作符的三种方式了,希望对大家有帮助。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.jianshu.com/p/e78e9d12dba1

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部

966
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40