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.remove(at: idx)
        
        case nil:
            break
        }

缺点

代码优点笨重,不够清晰

完美解决方案

if let idx = array.lastIndex(of: "four") {
            array.remove(at: idx)
        }

其他 if let 知识点

在同一个if 里面绑定多个值,更棒的是后面的绑定值,基于之前成功解包的操作。这在我们想要多次调用一些返回可选值得函数会特别有用,

列子:
比如 URL 和 UIImage 的构造方法都有可能失败

代码:

let urlString = "https://www.baidu.com"
        if let urlNew = URL(string: urlString),
           let data = try? Data(contentsOf: urlNew),
           let image = UIImage(data: data)
        {
            let view = UIImageView(image: image)
            
            
        }

多个let的每一部分也能拥有一个布尔的限定语句

在这里插入图片描述

如果我们需要在指定 if let 绑定之前执行一个检查,则可以为if 提供一个前置的条件

//判断一个地址是否是https
 let urlString:String? = "https://www.baidu.com"
        if  urlString!.hasPrefix("https"),
            let urlNew = urlString {
            print(urlNew)
        }

while let

作用:

它表示一个当遇到nil时终止循环

例子:

/*协议提供makeIterator方法创建迭代器,
    而迭代器中的nex方法将不断返回序列中的值,
    当序列中的值耗尽时,nil 将被返回值,所以
    我们用 while let 终止循环*/
    let array = [1,2,3]
    var itearator = array.makeIterator()
    while let i = itearator.next() {
            print(i)
    }

guard

guard关键字和常见的if关键字是一对兄弟般的关系。两者的目的是同样的 – 进行条件判别;只是在使用上有所不同。
我们很熟悉if-else,它表示条件成立则执行if中的内容,不然执行else语句中的内容。而guard-else则表示,如果guard成立则继续往下执行,不然在elsereturn

作用:

多个条件的保护

需求
商户地址用https请求

方案一

let merchants = "1"
        let hasUrl = "https://200.3.7070/gw/map/js"
        if hasUrl.hasPrefix("https") &&  merchants == "1" {
            print(hasUrl)
        }

缺点:

尽管这样这样已经很简洁了,但是当我们的条件越来越多的时候, if 判断的代码将变的更长更复杂,这种方式的可读性其实也不好。不仅如此,多条件的综合判断将使得代码更加混乱,可读性也随之降低,这并不十分可取。
那继续改进一下:

完美解决方案:

 let merchants = "1"
        let hasUrl = "https://200.3.7070/gw/map/js"
        guard  hasUrl.hasPrefix("https") else { return }
        guard  merchants == "1" else { return }
        print(hasUrl)

总结:

1.guard - else必须同时出现,而且,else中,必须进行return。
2.guard - else不能取代if - else。如果是两个选择判断语句中,我们还是使用if – else语法更为合理
3.guard - else在除非 - 则… - 不然 - 结束的语法中,使用最为合适。

//这种不存在结束的条件判断,并不适合使用guard关键字。
let a = 100 
if a > 80{
   print(a-80)
}esle{
   print(80-a)
}

if case

思考:

哪些地方用了case关键字

例子:
关于网络环境的判断 UAT 准生产 生产 ,是UAT时我们使用"https:120:302:6060"

定义了一个枚举

enum NetworkSettingType{
    //无效
    case  NetworkSettingInvalide
    //UAT
    case  NetworkSettingUAT
    //准生产
    case  NetworkSettingVirtualRelease
    //生产
    case  NetworkSettingRelease
}

方案一:用switch

let networkSettingType = NetworkSettingType.NetworkSettingUAT
        
        switch networkSettingType {
        case .NetworkSettingUAT:
            print("UAT环境")
        default:
            print("环境错误")
        }

缺点:

可能觉得这个方式还是过于繁琐

完美解决方案:if case

let networkSettingType = NetworkSettingType.NetworkSettingUAT
        
        if case .NetworkSettingUAT = networkSettingType {
            print("UAT环境")
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值