swift 中你可能不知道的可选模式匹配

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

之前的文章中有介绍过,swift 中的可选类型本质其实是个枚举,可以用 switch 语句来匹配,感兴趣可以去看下:

swift 关于可选类型你可能还不知道的5件事情

今天介绍一个你可能不知道的小技巧。

可选类型的匹配

首先看一下 Swift 中的可选类型 Optional 的定义:

java 复制代码
public enum Optional<Wrapped> {
    case none

    case some(Wrapped)
}

其实就是有两个 case 的枚举类型,一个是 none,一个是 .some(Wrapped),那么就可以使用 switch 语句来匹配了,举个例子:

swift 复制代码
let number: Int? = 20

switch number {
case .none:
    print("nil")
case .some(let value):
    print(value)
}

// 打印结果:20

有关联类型时,我想大家都知道使用 case .some(let value) 这种匹配方式,其实这行代码有个更简洁的语法case let value?,也就是说,上边的代码可以替换为:

swift 复制代码
let number: Int? = 20

switch number {
case .none:
    print("nil")
case let value?:
    print(value)
}

// 打印结果:20

case .some(let value) 换成 case let value? 以后是不是感觉代码更简洁了。

其他场景

如果你没觉得代码简洁多少,可以看一下下面这个场景,switch 多个可选类型:

swift 复制代码
let number: Int? = 10
let number1: Int? = 20
let number2: Int? = 30

switch (number, number1, number2) {
case (.none, .none, .none):
    print("nil")
case let (value?, value1?, value2?):
    print(value, value1, value2)
default:
    break
}

// 打印结果:10 20 30

原来的写法是

bash 复制代码
case (.some(let value), .some(let value1), .some(let value2))

现在的写法:

bash 复制代码
case let (value?, value1?, value2?):

用在 if 语句中

这种方式也可以用在 if 判断中:

swift 复制代码
let number: Int? = 10

if case let value? = number {
    print(value)
}
// 打印结果 10

用在 for 循环中:

这种方式也可以用在 for 循环中:

swift 复制代码
let numbers: [Int?] = [1, 2, nil, 4, nil]

for case let number? in numbers {
    print("有值 \(number)")
}
// 打印结果
// 有值 1
// 有值 2
// 有值 4

希望今天分享的小技巧能够帮到你。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
pop_xiaoli20 小时前
OC-实现下载单例类
ios·objective-c·cocoa·xcode
zhyongrui21 小时前
SnipTrip 菜单 Liquid Glass 实现方案:结构、材质、交互与深浅色策略
ios·性能优化·swiftui·交互·开源软件·材质
zhyongrui1 天前
SnipTrip 不发烫的实现路径:局部刷新 + 合成缓存 + 峰值削减
ios·swiftui
晚霞的不甘1 天前
Flutter for OpenHarmony 实现 iOS 风格科学计算器:从 UI 到表达式求值的完整解析
前端·flutter·ui·ios·前端框架·交互
初级代码游戏2 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏2 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui2 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhangfeng11332 天前
CSDN星图 支持大模型微调 trl axolotl Unsloth 趋动云 LLaMA-Factory Unsloth ms-swift 模型训练
服务器·人工智能·swift
Boxsc_midnight2 天前
【openclaw+imessage】【免费无限流量】集成方案,支持iphone手机+macos
ios·智能手机·iphone
感谢地心引力2 天前
安卓、苹果手机无线投屏到Windows
android·windows·ios·智能手机·安卓·苹果·投屏