Swift guard 和 if的使用

Swift guard比if判断好在哪里?为什么Swift不允许字符串使用===判断?如何理解Swift的if let语句?if条件语句一定需要括号括起来?if表达式? 本文介绍了Swift中条件语句的几个特性:1)guard语句比if更适合参数预警,代码更简洁;2)===不能用于字符串比较,因为字符串是值类型;3)if let语句可安全解包可选值;4)Swift的if语句不需要括号;5)if表达式可以返回值赋给变量。Swift的条件语句设计灵活,有助于编写更清晰的代码。 阅读详情

guard 的优势

Swift 2.0 带来了guard语句。但很多人还是不太理解guard的意义,特别是和 Swift 2.0 之前的简单if语句相比较。我们知道,所有的 guard 使用场景都可以用 if 来替代,那么为什么还要增加 guard 特性呢?其最最主要的原因还是 guard 语法的可读性更强。这里我们使用一个错误处理的例子,一个带有姓名和年龄的简单表格。

使用guard实现,代码为:

struct Person {
    let name: String
    var age: Int
}

struct PersonViewModel {
    var name: String?
    var age: String?

    enum InputError: ErrorType {
        case InputMissing
        case AgeIncorrect
    }

    func createPerson() throws -> Person {
        guard let age = age, let name = name
            where name.characters.count > 0 && age.characters.count > 0 else {
                throw InputError.InputMissing
        }
        guard let ageFormatted = Int(age) else {
            throw InputError.AgeIncorrect
        }       
        return Person(name: name, age: ageFormatted)
    }
}

如果使用if实现createPerson()方法,代码为:

   enum PersonResult {
        case Success(Person)
        case Failure(errorText: String)
    }
func createPersonNoGuard() -> PersonResult {
        if let age = age, let name = name
            where name.characters.count > 0 && age.characters.count > 0
        {
            if let ageFormatted = Int(age) {
                let person = Person(name: name, age: ageFormatted)
                return PersonResult.Success(person)
            } else {
                return PersonResult.Failure(errorText: "The age is invalid!")
            }
        } else {
            return PersonResult.Failure(errorText: "Information is Missing!")
        }
    }

和上面的 guard 实现相比,使用 guard 可以让我们的方法表意更加明确,更易于阅读,它能够表达“提前退出”的意图,提高了程序的健壮性。使用 guard 会强迫你编写 happy-path,如果出错会提前退出,从而必须处理可能发生的错误。换句话来理解这是 Swift 的设计者在暗示程序员在编写代码时时提早 return 的重要性。

这些情况下 guard 要慎用

但是,并不意味着要将所有的 if … else … 和 if let … 都替换成 guard 语法。guard 语法很容易被滥用和误用,并不是所有的代码层次结构中都适合 guard 的使用。

  • 作为 if 的相反情况时慎用

作为 if 的相反情况可以理解为作用域内的代码只有在传递进来的条件被判断为 false 的时候才执行.
例如当我们需要判断一个闭包参数表列中的 error 参数是否有返回值的时候,当 error 为 nil 时我们才有必要执行作用域内的代码,反之 return。

这种情况下用 if 去实现就十分的清晰,可读性更高:

geoCoder.geocodeAddressString(textStr) { (placemarks : [CLPlacemark]?, error : NSError?) in  
    // 为了编码的安全性考虑,我们对于必要的参数都要进行判断  
    // 如果有 error 那么就退出  
    if error != nil {   
        print("error --- \(error)")  
        return  
    }  

    // 如果有结果,那么看一下结果是否为空,为空退出  
    guard let placemarks = placemarks else {  
        return  
    }  
    // 遍历所有的坐标(经纬度)  
    for place in placemarks {  
        print("wzywzywzy")     
    }   
}

如果用 guard 去处理上面的 error,那么代码就变成了这样:

geoCoder.geocodeAddressString(textStr) { (placemarks : [CLPlacemark]?, error : NSError?) in  
    // 如果 error 存在,那么执行作用域内的代码  
    guard let error = error else {  
        // 如果有结果,那么看一下结果是否为空,为空退出  
        guard let placemarks = placemarks else {  
            return  
        }  

        // 遍历所有的坐标(经纬度)  
        for place in placemarks {  
            print("wzywzywzy")  
        }  
    }  

    // 作用域代码(存在 error,程序结束)  
    print("error --- \(error)")  
    return  
}

显然,用 guard 去处理上述情况就非常的不妥,造成了 guard 的大括号内还嵌套了一个 for 循环,可读性大大降低。

换句话说,如果你想让这个参数有值并使用它,那么就用 guard,如果你不想让这个参数有值那么就用 if 去判断。这样就可以将错误以及之后的 return 集中在一个大括号内,而顺利执行的作用域代码就在大括号外了。增强了代码的可读性。

  • 不要在 guard 的 else 语句中放入复杂代码

guard 的 else 语句中,不应该放大量的代码,除了简单的提前退出的语句外。如果你在 guard 的 else 代码块中用了其他的代码逻辑或是实现了任何实际功能,那么你就误用了 guard 了。

总之,除一些简单提前退出的语句和一些离开了当前函数的必要操作外,不应该有其他的代码。

最好在 guard 的 else 语句块内不要多过 2 ~ 3 行代码。

  • 不要用 guard 去代替一些比较复杂的 if else 语句

下面一段代码采用 if else 实现:

var str : String? = "Hello"  

if let helloStr = str where str!.hasPrefix("H") {  
    print(helloStr)  
} else {  
    print("不符合H开头要求")  
}

若采用 guard 去实现为:

var str : String? = "Hello"  

guard let helloStr2 = str where str!.hasPrefix("H") else {  
    print("不符合H开头要求")  
    return  
}  
print(helloStr2)

对于这种简单的情况而言,使用 if else 语句比起没有分支的 guard 语法更加容易理解。

最后提醒一点:在使用 guard 的时候,请确保自己已经对可选链有一个正确的了解,guard 可以帮助我们避免使用显示的 if let 进行解包。


原文链接:

http://www.cocoachina.com/swift/20160908/17509.html

https://www.jianshu.com/p/9fff7621ed75


Swift 语法糖 if let 和 guard 的使用     语法糖是指计算机语言中添加的某种特殊语法,这种语法对语言本身的功能没有什么影响,但更方便编程者使用,使用语法糖能够增加程序的可读性、优化代码,从而减少出错。    今天我想要说一下,Swift中的 if let 和 guard 这两颗语法糖是如何达到魔法功效的。    要知道if let 和 guard起到了什么作用,我们不妨先设想没有它们,代码是怎么写的。1. if letSwift 中... 阅读详情

相关推荐

如何获取Swift变量的内存内容?Swift如何让整数计算溢出不抛出异常?Windows搭建Swift语言编译环境?Swift结构体或枚举mutating的本质?Swift guard比if判断好?

Swift语言特性与应用指南: 本文介绍了Swift语言的多个核心特性与实用技巧,包括如何通过Mems工具查看变量内存内容,使用溢出操作符(&+/-/*)处理整数计算,以及在Windows平台搭建编译环境的方法。深入解析了mutating关键字对结构体/枚举的修改机制,对比了guard与if语句的防卫优势。概述了Swift作为现代编程语言的安全、高效、开源等特性,支持跨平台开发并与Objective-C兼容。最后提供了Swift版本演进和平台支持情况,帮助开发者更好地掌握这门语言。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 1148

Swift学习笔记(一):guard 和 if 的用法及区别

一、guard是什么?guard是 swift 2.0推出的新的判断语句的用法。guard语句和if语句类似,都是根据关键字之后的表达式的布尔值决定下一步执行什么。和if语句不同的是,guard语句只有一个代码块,而if语句可有多个代码块。(如 if 、else if、 else) 那么guard到底是什么作用呢?顾名思义,guard是作为保卫作用而存在的。当你不满足我的要求,那么请您出去;如果满足

从零开始学Swift 1万+

边缘AI硬件风向:从专用芯片到端侧大模型

边缘AI硬件正呈现五大发展趋势:专用AI加速芯片(如华为昇腾、谷歌EdgeTPU)凭借高能效比成为主流;端侧大模型催生支持Transformer架构的新硬件需求;存算一体技术突破内存墙限制;FPGA和可重构计算提供灵活性;异构集成与Chiplet技术实现模块化设计。这些发展需要配套软件工具链支持,未来边缘设备将演变成具备本地智能的"智能体",竞争焦点转向算力、能效、易用性和成本的多维平衡。

qq_37027335的博客 348

swift if和guard的具体使用区别

总的来说,虽然在某些情况下 `if` 和 `guard` 可能会看起来有些相似,但它们的主要区别在于使用场景和编码约定。- 在 Swift 社区中,通常推荐在需要验证条件并尽早返回的情况下使用 `guard` 语句,以增强代码的可读性和清晰度。- 在可选绑定方面,`if let` 和 `guard let` 的作用相似,都用于将可选值解包并绑定到一个新的常量或变量。- `guard` 语句通常用于条件不符合预期时执行早期返回操作,以避免后续代码的执行,提高代码的可读性和减少嵌套。

jzfjay的专栏 1058

生存分析机器学习问题

然而,随着人工智能 (AI) 和机器学习 (ML) 的兴起,科学家现在能够开发更复杂的模型,揭示这些数据集中的模式和特征,从而为癌症的生物学、诊断、预后、治疗和预后提供新的见解。病情更重的患者可能接受更强(或更弱)的治疗,导致治疗方案与不良预后(死亡)强相关。数据集中包含失访或研究结束时仍存活的患者(删失数据),他们的真实生存时间未知,仅知道其存活时间不低于观察到的最后一次随访时间。优先选择参数少、结构简单的模型(如带强正则化的线性模型、简单树模型),避免复杂模型(如深度神经网络)。时刻的状态是未知的。

4AM_明朝百晓生 1223

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 560

为什么 guard 比 if 好

Swift 2.0 带来了令人激动的guard语句。但很多人还是不太理解guard的意义,特别是和 Swift 2.0 之前的简单if语句相比较。这是个有意思的问题,所以到底为什么guard就是比if要好呢?让我们来好好分析一下……示例代码这里我们使用另一篇博文 错误处理 中的例子,一个带有姓名和年龄的简单表格。在开始之前我们先来看下这个例子。这次我们要关注viewModel部分,特别是creat...

liumiaomiao1991的博客 385

STM32F4_DHT11数字温湿度传感器

开机的时候先检测是否有DHT11存在,如果没有,则提示错误。DHT11和DS18B20相同,传感器输出的都是未编码的二进制数字。本节我们将利用STM32F4来读取DHT11的温湿度传感器,获取环境的温度和湿度值。因此:温湿度的读取方式就是整数部分的二进制转换成十进制放在整数部分;小数部分的二进制转换成十进制放在小数部分。DHT11和MCU的一次通讯时间最大3ms,主机连续向DHT11采样的间隔建议不小于100ms。DHT11是广州奥松有限公司生产的一款温湿度一体化的数字传感器。数据分小数部分和整数部分。

light_2025的博客 3432

swift学习日志—— if let 与 guard 语法糖

工作比较忙,加上swift3.0也快出来了,听说核心代码又改变了(妈蛋,又得改代码了),swift的学习放了好久,有些都快忘了,赶紧复习下。 好,进入正题。 话说if let 和 guard 只是语法糖,没有也可以,但有了可以使得代码更简洁方便。要理解 if let 和 guard,不妨设想假如没有这两者,代码会怎么写。 -----------------------------------

jaccty的博客 4860

【open judge】【程设】魔兽世界三开战!

#程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include<typeinfo>)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再...

weixin_40841416的博客 6073

AgentScope 实战训练营-A2UI的完整实现:从概念到部署全流程

本文详细介绍了如何在AgentScope框架中实现Google的A2UI(Agent-to-Agent UI)协议,构建一个能生成可交互UI的智能体应用。文章涵盖了从环境准备、架构设计、核心代码实现到测试部署的完整流程,包括A2UI协议解析、技能系统、客户端实现、通信机制等核心技术点,适合AI Agent和前端开发人员学习参考。

program哲学 201

Swift中一些常见的关键字(if let 、while let、guard、if case)

if let 需求: var array = [“one”,“two”,“three”,“four”] 发现数组中最后一个元素是否"four" 把它移除? 作用: 主要使用它解决Optional对象解包时产生空对象的处理。 解决方案一 switch array.lastIndex(of: "four") { case let idx?: array.re...

Z1591090的博客 3937

Untiy之如何实现AI+MR (Pico4u 相机推流MR画面给Server做实时AI图像识别)

本文介绍了基于Pico4U企业版开发AI+MR应用的实现方案。文章详细说明了硬件准备步骤,包括购买企业版设备、申请相机权限和注册管理平台。重点讲解了Unity开发中获取摄像头画面的两种技术方案:通过Overlay直接渲染到Android Surface,或使用API获取图像数据转换为Texture。提供了完整的代码示例和权限配置说明,并揭示了底层通过JNI调用Android原生API的技术原理。该方案适用于带电操作等实习场景,可提升安全性和学习趣味性。

TxNet 1339

Swift 新语法 guard 语法 与 if else 对比

原文地址:http://www.jianshu.com/p/3a8e45af7fdd 直接看代码 func fooManualCheck(x:Int?) { if x ==nil || x <= 0 { return } x!.description } //1.你是在检查一个不符合你期望的条

CrazyEngineer_Xin的博客 2038

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3404

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Swift学习记录 -- 3. 逻辑分支语句(if , else if ,三目运算 ,guard)

Swift 中 if , else if ,三目运算相较OC来说 , 除了更加精简 , 几乎没有变化 . 只是Swift中新增了 guard判断 , Switch得到大力加强. Switch留到下篇文章进行讲解 //if 用法 // 1. if后面 ()可以省略 // 2. 判断句不再有非0即真,判断句必须有明确的真假(BOOL-->true/false)

coderMy的博客 805

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

swift: if和guard以及携带let语句的使用说明

swift: if和guard以及携带let语句的使用说明

微尘子 1545

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【iOS】swift-如何理解 if let 与guard?

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:黄兢成 链接:http://www.zhihu.com/question/36448325/answer/68614858 来源:知乎 if let 和 guard 只是语法糖,没有也可以,但有了可以使得代码更简洁方便。要理解 if let 和 guard,不妨设想假如没有这两者,代码会怎么写。 ----

chelongfei的博客 885

Swift 基本语法-"if let"和"guard let"

Swift 基本语法01-Swift简介Swift 基本语法02-"let"和"var"Swift 基本语法04-"switch"和"for"Swift 基本语法05-"String"Swift 基本语法06-数组和字典1. if let用法1.1 普通if与if let的比较1&gt; 如果常量是可选项(Optional),if判断后仍然需要解包(!)let name: String? = &quo

ziyikongfu的专栏 3160

3.Swift 基本语法 控制流 if let ,guard let,switch

控制流 if Swift 中没有 C 语言中的非零即真概念 在逻辑判断时必须显示地指明具体的判断条件true/false if 语句条件的()可以省略 但是{}不能省略 let num = 200 if num < 10 { print("比 10 ...

chijiongyuan9948的博客 346

swift学习笔记--swift3.0 if-let、guard语句中的where的替换

关于swift3.0中if-let、guard语句中的where的替换

王立涛的博客 3261

Swift的if let和guard let的使用 <一看就懂哟>

// // ViewController.swift // 可选项的判断 // // Created by 思 彭 on 16/9/16. // Copyright © 2016年 思 彭. All rights reserved. // import UIKit class ViewController: UIViewController { o...

weixin_30603633的博客 254

swift中 if let 与 guard let 对比,guard会降低一个分支

1 //用if let与guard let实现同一效果,会发现guard降低一个分支 2 //可以用if var guard var 表示定义的变量能修改值 3 func test(){ 4 let name:String? = "张三" 5 6 if let a = name { 7 print(a) 8 }el...

weixin_30745641的博客 102

Swift 条件语句详解:if、switch 与 guard 的实战用法

if 语句:适合简单的条件判断和可选值局部解包。switch 语句:支持区间匹配、元组匹配、值绑定和 where 过滤,功能强大。guard 语句:适合在函数入口做参数校验,让主逻辑保持扁平清晰。在实际开发中,建议优先使用guard处理异常情况和提前退出,使用switch处理多分支匹配,使用if处理简单判断。掌握这三种条件语句的适用场景,能让你的 Swift 代码更加简洁、安全和易读。

liuhelanor的博客 439

Swift中逻辑分支(条件判断)使用详情(if-else if,guard,switch, while, where)

Swift中中(if-else if,guard,switch, while, where)使用详情

eastWind1101的博客 476

Swift 流程控制完全指南:if、guard、switch 与循环详解

编程语言中的流程控制语句决定了代码的执行路径,是构建复杂逻辑的基石。Swift 作为现代 iOS 开发主力语言,在保留类 C 语法风格的同时,引入了诸多编译期安全机制:switch 自动中断无需 break、case 支持区间/元组/值绑定等模式匹配、guard 强制提前退出避免深层嵌套。理解这些特性不仅有助于写出更清晰的代码,还能将常见运行时错误提前暴露在编译阶段。无论是处理可选值、遍历集合,还是跳出多层循环,Swift 的流程控制都提供了更安全的语法表达。本文以实践笔记的形式系统梳理 Swift 的条件

weixin_31309419的博客 228
上一篇: ARKit概念解析一: position vs worldPosition vs simdPosition
下一篇: UIControl 和 UIGesture增加点击间隔
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值