Swift中的"警卫队"

大半个月没有更新自己的博客了,最近在忙一个新项目时间非常紧张,所以最近的博客更新进度就要稍微放缓一点了。

这个项目是纯粹的Swift项目,所以最近的博客会结合自己在使用Swift这门语言的过程中,对Swift的总结和感悟。今天就来介绍一下能让你在Swift中如虎添翼的警卫队成员 —— guard

我们在编写业务代码中,经常会遇到的一种情况就是一大串的if else,一层又一层的甚至还有嵌套,看的眼花缭乱,有时候根本不知道跑到了哪一层了,代码的可读性非常差。而在Swift里有比if else*更优雅的写法,那就是guard

使用 guard 来判断 nil

传统的Objective-C在判断nil的时候,会用下面的写法:

if (something == nil) {
    // doSomething
} else {
    // throw error
}

而若是我们改用guard来实现的话会是下面的情况:

guard (something == nil) else {
    // throw error
    return // guard 裡面一定要有 return
}

// doSomething

改成这样,判断并不会一层一层的累加下去,代码看上去也比之前美观易懂了很多,但是要注意的是不要搞错逻辑,免得直接return了。

而这样的用法也符合Swift编码规范所强调的那样,尽早的Return或者break

使用 guard 来判断类型

介于Swift里的Optional类型的增加,我们有时候也可以使用guard来判断一个属性的类型。例如如下代码所做的那样:

// 声明的function
func doSomething(input: Bool, handler: (obj: AnyObject?) -> Void) -> Void {
    let someDict: [Int: String] = [1: "One", 2: "Two", 3: "Three"]

    if input {
        handler(obj: someDict)
    } else {
        handler(obj: [1,2,3])
    }
}

// 执行函数
doSomething(true) { (obj) -> Void in
    // 判断是否为 [Int:String] 的类型(Dictionary)
    guard let someDict = obj as? [Int:String] else {
        print("obj not match dictionary")
        return
    }
    // 将 Dictionary 里面每个 value 打印出来
    for (key, value) in someDict {
        print("Dictionary key \(key) -  Dictionary value \(value)")
    }
    // 自行输入 key 但会印出 Optional
    print( "Value of key = 1 is \(someDict[1])" )
    print( "Value of key = 2 is \(someDict[2])" )
    print( "Value of key = 3 is \(someDict[3])" )
}

通过上面的?,我们已经可以看到一个如何对可选类型解包的操作了。许多人在初入Swift的大门时,经常被可选类型搞的程序Crash,所以学以致用,用上优雅的警卫队吧。让他来帮助你实现更加优雅健壮的代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏趣学算法

数据结构 第7讲 循环队列

过了一段时间,小张再也受不了这种"起早贪黑"的有车生活。为了解决胡同停车问题,小张跑了无数次居委会,终于将挡在胡同口的建筑清除,这样住在胡同尽头的小张,就可以早...

16420
来自专栏Ryan Miao

Java String.split()用法小结

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必...

352110
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

9830
来自专栏达摩兵的技术空间

前端面试题分享001

解释 :要注意的是函数中的this与运行环境强相关,与定义环境不相关。所以下面的代码段中,当直接通过对象属性方法中去调用时,其都可以访问到对象的属性,但是当其变...

9640
来自专栏静晴轩

JavaScript 之 this 详解

JavaScript作为一种脚本语言身份的存在,因此被很多人认为是简单易学的。然而情况恰恰相反,JavaScript支持函数式编程、闭包、基于原型的继承等高级功...

46050
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

250100
来自专栏信数据得永生

JavaScript 编程精解 中文第三版 五、高阶函数

309100
来自专栏偏前端工程师的驿站

(cljs/run-at (JSVM. :all) "Metadata就这样哦")

10120
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻Runtime本质(二)

27320
来自专栏恰童鞋骚年

正则表达式30分钟入门教程--deerchao

原文地址:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaoc...

27740

扫码关注云+社区

领取腾讯云代金券