swift_038(Swift之guard关键字(守护))
来源:互联网 发布:软件行业的进项 编辑:程序博客网 时间:2024/05/14 03:44
Swift - guard关键字(守护)
guard
语句和if
语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。但与if
语句不同的是,guard
语句只会有一个代码块,不像if
语句可以if else
多个代码块。
那么guard
语句的作用到底是什么呢?顾名思义,就是守护。guard
语句判断其后的表达式布尔值为false
时,才会执行之后代码块里的代码,如果为true
,则跳过整个guard
语句,我们举例来看看。
我们以今年高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func
checkup
(
person
: [
String
:
String
!]) {
// 检查身份证,如果身份证没带,则不能进入考场
guard
let
id
=
person
[
"id"
]
else
{
print
(
"没有身份证,不能进入考场!"
)
return
}
// 检查准考证,如果准考证没带,则不能进入考场
guard
let
examNumber
=
person
[
"examNumber"
]
else
{
print
(
"没有准考证,不能进入考场!"
)
return
}
// 身份证和准考证齐全,方可进入考场
print
(
"您的身份证号为:\(
id
),准考证号为:\(
examNumber
)。请进入考场!"
)
}
checkup
([
"id"
:
"123456"
])
// 没有准考证,不能进入考场!
checkup
([
"examNumber"
:
"654321"
])
// 没有身份证,不能进入考场!
checkup
([
"id"
:
"123456"
,
"examNumber"
:
"654321"
])
// 您的身份证号为:123456,准考证号为:654321。请进入考场!
上述代码中的第一个guard
语句用于检查身份证,如果检查到身份证没带,也就是表达式为false
时,执行大括号里的代码,并返回。第二个guard
语句则检查准考证。
如果两证齐全,则执行最后一个打印语句,上面的两个guard
语句大括号内的代码都不会执行,因为他们表达式的布尔值都是true
。
这里值得注意的是,id
和examNumber
可以在guard
语句之外使用,也就是说当guard
对其表达式进行验证后,id
和examNumber
可在整个方法的作用域中使用,并且是解包后的。
我们再用if else
语句写一个类似的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func
checkupUseIf
(
person
: [
String
:
String
!]) {
if
let
id
=
person
[
"id"
],
let
examNumber
=
person
[
"examNumber"
] {
print
(
"您的身份证号为:\(
id
),准考证号为:\(
examNumber
)。请进入考场!"
)
}
else
{
print
(
"证件不齐全,不能进入考场!"
)
}
print
(
"您的身份证号为:\(
id
),准考证号为:\(
examNumber
)"
)
// 报异常
}
checkupUseIf
([
"id"
:
"123456"
])
// 证件不齐全,不能进入考场!
checkupUseIf
([
"examNumber"
:
"654321"
])
// 证件不齐全,不能进入考场!
checkupUseIf
([
"id"
:
"123456"
,
"examNumber"
:
"654321"
])
// 您的身份证号为:123456,准考证号为:654321。请进入考场!
我们可以看到用if else
实现的方法显然不如guard
实现的那么精准。而且id
和examNumber
的作用域只限在if
的第一个大括号内,超出这个作用域编译就会报错。
我们举一个电影院检票的例子://票务struct Ticket{ var movieName:String//该场电影名字 var TimeValid:Bool = true//电影票有效}func checkTicket(ticket:Ticket?,currentMovieName:String){ guard let _ = ticket,ticket?.movieName == currentMovieName else { print("非此场电影") return } guard ticket?.TimeValid else { print("该票已过期") return } //TODO: print("可以看电影了")}
Swift:这些情况下 guard 要慎用
Tip 1 不要用 guard —— 作为 if 的相反情况时
Tip 2 不要用 guard —— 不要在 guard 的 else 语句中放入复杂代码
Tip 3 不要用 guard —— 不要用 guard 去代替一些比较复杂的 if else 语句
最后提醒一点:在使用 guard 的时候,请确保自己已经对可选链有一个正确的了解,guard 可以帮助我们避免使用显示的 if let 进行解包。参考:(http://www.cocoachina.com/swift/20160908/17509.html)
阅读全文
0 0
- swift_038(Swift之guard关键字(守护))
- Swift 2.0关键字guard
- swift guard关键字使用
- swift 关键字guard 计算属性
- Swift 系统学习 17 guard else (守护)
- Swift语法之 guard
- swift guard
- Swift基础之守卫语句guard
- SWIFT逻辑控制之where与guard
- swift之mutating关键字
- swift之mutating关键字
- swift之mutating关键字
- swift之mutating关键字
- swift之mutating关键字
- swift之mutating关键字
- swift之mutating关键字
- Swift Guard Statement
- swift Guard语法
- 【学习笔记】天嵌2440第三季下学期——linux tcp网络编程
- Linux中三种网络模式是什么意思——bridged(一桥接模式)
- echarts 地图区域无法显示
- CSS visibility占位隐藏属性
- Mybatis Generator最完整配置详解
- swift_038(Swift之guard关键字(守护))
- ios之Autolayout的运用
- Makefile详解(一)
- poi操作excel文件
- 【2017多校】HDU6053 TrickGCD 【莫比乌斯】
- 自己学着写一个BindView来减少findViewById的应用
- Hibernate---缓存
- react-native之初识react-native
- ZooKeeper典型应用——分布式锁