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成立则继续往下执行,不然在else中return。
作用:
多个条件的保护
需求
商户地址用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环境")
}