首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

代码重构(四):条件表达式重构规则

五、Replace Nested Condition with Guard Clauses(以卫语句取代嵌套的条件) 条件表达式的嵌套是令人讨厌的东西。...将我们在使用从相应的字典中取出的value做为key再次取值时,我们要保证该值不为nil,所以我们要进行if-let判断。...if-let所表示的意思是在取值时,如果当前取出的值不为nil,那么就执行if后的语句体,如果为nil,那么就不执行。这样一来,就会出现多层if-let嵌套的情况。...guard语句的用法就是如果guard 后方的赋值语句所取出的值为nil,那么就会执行else中的语句,否则就会继续往下执行。在else中一般是break、return、continue等卫语句。...六、Replace Condition with Polymorphism(以多态取代条件表达式) 在介绍“以多态取代条件表达式”之前呢,首先要理解面向对象中多态是什么,也就是说多态是干嘛的。

1.6K90

Swift基础 错误处理

有四种方法可以处理 Swift 中的错误。您可以将错误从函数传播到调用该函数的代码,使用do-catch语句处理错误,将错误作为可选值处理,或断言不会发生错误。每种方法都在下面的一节中描述。...guard语句提前退出方法,如果不符合购买零食的任何要求,则会抛出适当的错误。...由于vend(itemNamed:)方法传播它抛出的任何错误,因此任何调用此方法的代码都必须使用do-catch语句、try?或try!处理错误,或继续传播它们。...当您想以相同的方式处理所有错误时,允许您编写简洁的错误处理代码。例如,以下代码使用几种方法来获取数据,如果所有方法都失败,则返回nil。 func fetchData() -> Data?...此语句允许您进行任何必要的清理,无论执行如何离开当前代码块,无论是因为抛出错误还是因为return或break等语句而离开。例如,您可以使用defer语句来确保文件描述符关闭并释放手动分配的内存。

15800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Swift系列五 - 可选项

    可选项,一般也叫可选类型,它允许将值设为nil。 一、定义可选项 平时开发中,如果我们需要把一个变量置空时只需要把变量赋值一个nil即可: 上面尝试后不行,那怎么把一个变量置空呢?...= nil 五、guard的使用 格式: guard 条件 else { // ToDo 退出当前作用域 // return、break、continue、throw error...} 特点: 当条件为false时,执行大括号里面的代码;当条件为true时,就会跳过guard语句; guard语句必须有退出指令; guard语句适合用来”提前退出“; 当使用guard语句进行可选项绑定时...扩展:字典取值如果key存在返回可选类型的value,不存在就返回nil;数组取值如果下标存在返回对应的值(不是可选类型),否则直接报错(越界)。...所以,如果能够隐式解包的应用场景就是能够确保可选项一定是有值的,否则就会容易出错。同时建议少用隐式解包(既然不能非空,直接赋值就可以了,不需要包装成可选类型)。

    66120

    Hi Swifter:来和Guard问声好吧

    与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。...通过上面两个示例的介绍,读者不难发现:guard 语句与if 语句非常相似,甚至看不出guard语句的优势。这是为什么呢?这就涉及guard 的作用和使用场景的问题了。...很多时候,guard 语句都用于处理可选绑定—使用guard 语句保证可选类型有值。例如,如下程序。 ?...上面程序中 guard 语句出现在test()函数中,guard 语句的作用是保证程序调用test()函数时传入的参数不为nil。...如果程序传入的参数为nil,guard 语句中的可选绑定失败,程序执行else块,而else 块中的 return 语句将会跳出test()函数;如果调用test()函数传入的参数不为nil,则guard

    57010

    Swift进阶四——流程控制

    这才能确保无论复合匹配中的哪部分命中了,接下来的函数体中的代码都能访问到绑定的值并且值的类型也是一样的。...在循环体中使用break的时候,break会立即结束循环的执行,并将控制转移到循环结束花括号(})之后的第一行代码上。当前遍历中的其他代码都不会被执行,并且余下的遍历循环也不会开始了。...在循环语句中,你可以使用语句标签来配合break或者continue来结束或者继续执行被标记的语句。...使用guard来改善条件判断 guard语句,类似于if语句,都是基于布尔值表达式来执行语句的。 guard语句与if语句一样,都是要求条件语句为真才能执行之后的语句。...= a { print(x) // 不会走到这里 } 可选项模式会为for-in语句提供一种迭代数组的便捷方式,可以只为数组中的非nil元素执行循环体: let arrayOfOptionalInts

    84610

    Swift基础语法(一)

    a : b); guard的使用 guard语句与if语句非常类似,但是与if语句不同的是,guard语句当条件为false的时候才会执行{}里面的代码。...和OC中的switch用法基本一致,其不同点在于: Swift中的case后面的语句块执行完毕之后可以不跟break,因为默认会有break Swift中,一个case可以判断多个值,多个值以,隔开...常量 = 可选型】语句的作用是:如果可选型的值不是nil,那么就将可选型的真实值传给常量,并且执行花括号{}里面的语句;如果可选型的值是nil,那么【常量 = 可选型】这个条件就不成立(因为不能直接给一个非可选型变量赋值为...nil),那么就不会走到花括号里面的内容。...与if-let相对应的,有一个guard-let,其具体使用方式如下: guard let 常量 = 可选型变量 else { //当可选型是nil的时候,会执行到花括号里面的语句 return

    4.3K30

    “身首异处”的序列(Swift)

    上面说了累加,稍微扩展一下,累乘呢?当然也可以。...我以multiResult为例稍微讲解一下这个函数的过程。这个函数的重点当然是递归,事实上我认为递归可以说是函数式编程这种范式的核心之一。...5和reduce([], initValue: 1, function: *)的返回值将作为乘法的左右因数相乘,而[]是个空数组,它的decompose属性返回nil,所以执行else之后的代码块,即返回...else { return 0 } return head + sum(tail) } 新的sum函数使用Swift2的新特性guard进行提前返回,guard是我很喜欢的一个语法...,哪怕不是为了尾递归优化,我也推荐大家使用guard语句处理边界条件然后提前返回,这也是所谓的防御式编程中所提倡的,我之前的一篇文章也有提到。

    67220

    iOS Swift基础语法(二)

    ,并且这些成员的数据类型可以不同,把成员值放到一个括号中,以逗号分隔。...)") 2.5、可选型 可选型用于某些不确定是否有值的情况,其有两个返回值:具体的值和nil,nil表示空值。...之后为一个非可选型的值。“??”操作符自带解包功能,在赋值时“??”会检查其之前的可选型:如果可选型不为nil,则将其解包并返回;如果其为nil,则不会返回nil,则此时返回“??”...如果age为nil,那么大括号中的代码不会执行,使用可选解包程序不会崩溃。guard-let-else是Swift2.2新引入的格式,示例如下: var age:Int?...} print(a) //在外部使用解包后的值 } 不同于if-let,guard-let-else首先处理age为nil的情况,在此种情况中必须在大括号中使用return或者break提前终止代码

    1.1K30

    如何在Java和Swift中避免空引用异常?

    实现这个任务的一种方法是: 上面的代码,如果userRepository不是null,则此代码不会抛出NullPointerException。但是,代码中有三个if语句用于执行null检查。...这可以通过使用可选绑定、nil-合并操作符或guard语句来避免。..."neither zip code nor city found for user (user)" } Guard 保护语句,顾名思义,是在它后面保护代码。...一个保护语句只包含一个条件和/或一个未包装的语句和一个强制的else块。编译器通过使用控制传输语句(返回、抛出、中断、继续)或调用从未返回类型的方法来确保这个else块退出其封闭范围。...可选项的未包装值可以在保护语句的封闭范围中看到,在这里可以像使用普通常量一样使用它。保护语句使代码更具可读性,并防止大量嵌套if语句。

    2.7K30

    Swift基础语法简化版

    a : b); guard的使用 guard语句与if语句非常类似,但是与if语句不同的是,guard语句当条件为false的时候才会执行{}里面的代码。...guard语句必须带有else语句,他的语法如下: 当条件表达式为true的时候跳过else语句的内容,执行后面的语句组; 当条件表达式为false的时候执行else语句中的内容,跳转语句一般是return...、break、continue或者throw guard 条件表达式 else { //当条件表达式不成立的时候执行的语句 break} 语句组 另外一个需要说明的点是,guard语句必须放在函数中...常量 = 可选型】语句的作用是:如果可选型的值不是nil,那么就将可选型的真实值传给常量,并且执行花括号{}里面的语句;如果可选型的值是nil,那么【常量 = 可选型】这个条件就不成立(因为不能直接给一个非可选型变量赋值为...nil),那么就不会走到花括号里面的内容。

    3.8K50

    Swift AsyncSequence — 代码实例详解

    换句话说:它是我们在 Swift 中熟悉的常规序列的一个异步变体。 就像你不会经常创建你的自定义序列一样,我不期望你经常创建一个自定义的 AsyncSequence 实现。...如果你没有使用过 async/await,我鼓励你阅读我的文章:Swift 中的async/await ——代码实例详解 值可以随着时间的推移而变得可用,这意味着一个 AsyncSequence 在你第一次使用它时可能不包含也可能包含一些...因此,这只是一个代码例子,以更好地理解 AsyncSequence 的工作原理。 下面的例子沿用了原始提案中的例子,实现了一个计数器。这些值可以立即使用,所以对异步序列没有太大的需求。...一旦不再有预期的值,我们就退出for循环。异步序列的实现者可以通过在 next() 方法中返回 nil 来表示达到极限。...其结果是,我们可以以异步的方式执行映射和过滤等操作。

    70320

    5.逻辑分支

    = nil { view!.backgroundColor = UIColor.red } 三....a : b print(result) 四.guard的使用 guard是Swift2.0新增的语法 它与if语句非常类似,它设计的目的是提高程序的可读性 guard语句必须带有else语句,它的语法如下...: 当条件表达式为true时候跳过else语句中的内容,执行语句组内容 条件表达式为false时候执行else语句中的内容,跳转语句一般是return、break、continue和throw guard...Switch作为选择结构中必不可少的语句也被加入到了Swift中 只要有过编程经验的人对Switch语句都不会感到陌生 但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性 switch...多个值以,隔开 let sex = 0 switch sex { case 0, 1: print("正常人") default: print("其他

    56010

    46 道 Swift 常见面试题解

    9、为什么数组索引越界会崩溃,而字典用下标取值时 key 没有对应值的话返回的是 nil 不会崩溃。...{ func someFunction() } ▐ 2.10 guard 使用场景 guard 和 if 类似, 不同的是, guard 总是有一个 else 语句, 如果表达式是假或者值绑定失败的时候...的作用 可选值的默认值, 当可选值为nil 的时候, 会返回后面的值. 如 let someValue = optional1 ??...依靠的是闭包类型的自动推断 闭包中语句只有一句时, 自动将这一句的结果作为返回值 ▐ 2.33 什么是高阶函数 一个函数如果可以以某一个函数作为参数, 或者是返回值, 那么这个函数就称之为高阶函数,..., 而动态库则是多个程序之间共享 ▐ 3.9 为什么数组索引越界会崩溃,而字典用下标取值时 key 没有对应值的话返回的是 nil 不会崩溃 待更新,暂时没有最优解 ▐ 3.10 一个函数的参数类型只要是数字

    5.2K33

    将模型添加到场景中 - 在您的环境中显示3D内容

    调整大小以填充整个视图控制器。 约束 然后,单击Storyboard编辑器左下角的第四个图标,将新约束添加到场景视图中。定义约束以确保您的用户界面适应不同的屏幕尺寸或设备方向。...guard let model = scene.rootNode.childNode(withName: "SketchUp", recursively: false) else {return nil...我们首先确保焦点方块首先存在,因为它只在检测到表面时才出现在屏幕上。 guard focusSquare != nil else {return} 我们选择展示的模型是iPhoneX。...在我们的情况下,使用[switch]控制流来匹配我们设置的许多条件是完美的。switch语句必须是详尽的,这就是为什么有一个默认情况来涵盖所有其他方案。...我们实际上没有选择,因为节点具有isHidden的属性,并且不显示一个for。好吧,不是我所知道的。 那么,让我们来看看这两个场景。

    5.5K20

    Swift算法俱乐部:Swift队列数据结构(Queue)

    这可确保入队的第一个元素也是首先出队的元素。 先到先出 在许多算法中,我们希望在某个时间点将项目添加到临时列表中,然后在以后再次将它们从列表中拉出。 添加和删除这些项目的顺序非常重要。...然后,继续将下一个号码添加到队列中: queue.enqueue(3) 队列现在是[10,3]。 继续添加: queue.enqueue(57) 队列现在是[10,3,57]。...实现队列 在本节中,将实现一个存储Int值的简单通用队列。...使用guard语句处理队列为空。 如果这个队列是空的,那么guard将会进入else块。 查看(Peek) 队列还需要一个peek方法,它在队列的开始处返回该项目而不删除它。...现在控制台的输出编程如下样式: [10, 3, 57] Swift通用队列实现 此时,我们已经实现了一个存储Int值的通用队列,并提供了在Queue类中查看,排队和出列项目的功能。

    90220

    嗯,我试过了,真香

    上述代码它的返回值 result 是 Product.PurchaseResult 类型,它是一个枚举类型,定义了此次购买的订单状态,分别为: public enum PurchaseResult {...,该枚举还返回了一个 VerificationResult类型参数,这个参数是用来干嘛的呢!...验证票据 看到这里,有的同学可能会问,在上一版本的内购中,我们需要对购买的商品订单 进行票据验证,而且验证的过程还非常的麻烦,但是在新版本中怎么没有体现出来呢!...想必看过我 PurchaseX 第一版本的同学都应该清楚本地验证有多麻烦,我们要借用第三方的 OpenSSL 库去解析票据的各种属性和值,然后去一一验证,在这里我就不多做阐述了,感兴趣的可以去看下我的代码...在新版本中,苹果引入了 JWS 来帮助我们校验订单的安全性,发起支付后,purchase() 函数会返回给我们一个枚举类型 PurchaseResult,并且当枚举值为 success 的时候,我们即可通过它的回调参数

    4.1K21

    Swift基础 控制流程

    上面的例子检查温度是小于还是等于32华氏度(水的冰点)。如果是,则打印一条消息。否则,不会打印消息,代码执行在if语句的关闭大括号后继续。...这确保了无论复合情况的哪个部分匹配,大小写正文中的代码都可以始终访问绑定的值,并且该值始终具有相同的类型。...由于是可选类型,possibleIntegerValue变量的隐式初始值为nil,因此只有当possibleIntegerValue被switch语句的前四种情况之一设置为实际值时,可选绑定才会成功。...如果满足guard语句的条件,则在guard语句的闭幕大括号后继续执行代码。使用可选绑定作为条件的一部分分配值的任何变量或常量都可用于guard语句中显示的代码块的其余部分。...检查API可用性 Swift内置了对检查API可用性的支持,这确保您不会意外使用给定部署目标上不可用的API。

    11400
    领券