“===”与case表达

在case表达式中,判断与when后指定的值是否一致可以使用“===”运算符来表示。

“===”的左边如果是数值或字符串,则意义与“==”是一样的;

在正则表达式的场合下相当于“=~”,即匹配判定;

在类的场合下,判断“===”右边的对象是否是类的实例。

与其说“===”是进行其左右两边“值”的比较,还不如把它看作判断是否等同。

下面是case表达与if表达间的转换,when指定的对象在if表达中总是在“===”的左边,这点要特别注意。

```swift enum DeviceListMasterSelectedType: Int { case favorite = 0 case all case site } ``` --- ### ✅ **1. 这段代码的作用** 这是一个 **Swift 枚举(Enum)**,用于表示“设备列表主界面中用户选择的分类类型”。 它定义了三种可能的状态: - `.favorite`:仅显示收藏的设备(值为 `0`) - `.all`:显示所有设备(值为 `1`,自动递增) - `.site`:按站点/分组展示设备(值为 `2`) 该枚举通常被用在如下场景: - 控制 `SegmentedControl` 或标签页切换; - 决定设备列表的数据过滤方式; - 存储当前选中的 tab 状态; - 作为网络请求参数传递给后端以获取对应类型的设备列表。 > 它本质上是一个 **UI 状态 + 数据筛选逻辑标识符**。 --- ### 🧩 **2. 类型分类** | 分类维度 | 归属 | |--------|------| | **职责类型** | UI状态管理 / 数据筛选标记 | | **所属层级** | View 或 ViewModel 层(不属 Model 层) | | **模式归属** | 可复用的常量枚举(Constant Enum) | | **是否应解耦** | 是 —— 应独立存在,但需合理命名和组织 | ⚠️ 当前问题(如果这个 enum 在 ViewController 文件里): - 属于可复用的状态标识,却被局限在一个文件中; - 多个模块(如另一个 VC 或 Coordinator)若需要判断当前类型,会重复定义或引用困难; - 使用 `Int` 赋值虽然兼容 Objective-C 或旧 API,但不够安全且语义弱。 --- ### 🔧 **3. 解耦建议** #### ✅ 建议提取为独立文件,并增强语义安全性 ##### 推荐路径: ``` Common/ └── Enums/ └── DeviceListFilterType.swift ``` 或更贴近业务: ``` Features/DeviceList/ └── Types/ └── DeviceListFilterType.swift ``` > 不推荐放在 ViewController 内部或匿名 extension 中。 --- ### 💡 **4. 改进建议 & 示例代码** ```swift // File: DeviceListFilterType.swift import Foundation /// 设备列表的筛选视图类型,用于控制数据显示范围 enum DeviceListFilterType: Int, CaseIterable { /// 收藏的设备 case favorite = 0 /// 所有设备 case all = 1 /// 按站点分组的设备 case site = 2 // MARK: - 辅助属性 /// 对应的本地化标题,可用于 SegmentControl 显示 var localizedTitle: String { switch self { case .favorite: return LocalizedString(key: "favorite_devices") case .all: return LocalizedString(key: "all_devices") case .site: return LocalizedString(key: "by_site") } } /// 是否需要从服务器拉取特定数据?(示例扩展) var requiresRemoteFetch: Bool { return self != .all // 假设只有 all 可本地合并完成 } } ``` #### ✅ 使用优势: - 添加了 `localizedTitle`,便于直接绑定 UI(如 UISegmentedControl 或 PageTabBar); - 实现 `CaseIterable`,支持遍历所有选项,可用于动态生成 tab 列表; - 增加语义化方法(如 `requiresRemoteFetch`),提升可维护性; - 避免 magic number 和硬编码字符串; --- ### 📱 在 ViewController 中如何使用? ```swift class DeviceListViewController: UIViewController { private var currentFilter: DeviceListFilterType = .all @IBAction func segmentChanged(_ sender: UISegmentedControl) { guard let type = DeviceListFilterType(rawValue: sender.selectedSegmentIndex) else { return } currentFilter = type refreshDeviceList() } private func refreshDeviceList() { switch currentFilter { case .favorite: fetchFavoriteDevices() case .all: fetchAllDevices() case .site: fetchDevicesBySite() } } } ``` --- ### 📁 **5. 解耦后应放在哪?** | 内容 | 推荐位置 | 说明 | |------|----------|------| | `DeviceListFilterType.swift` | `/Common/Enums/` 或 `/Features/DeviceList/Types/` | 根据项目结构选择 | | 若多处使用 | 提升至共享模块(如 Common/UIKitExtensions) | 避免重复 | | 关联逻辑(如 filter logic) | 可配合 `ViewModel` 或 `UseCase` 使用 | 实现 MVVM/Clean Architecture | --- ### ✅ **总结** 你正在处理的几千行 ViewController 很可能包含大量类似这种“小而关键”的枚举、状态码、magic number。这类内容虽不起眼,却是造成 **紧耦合、难测试、易出错** 的根源之一。 通过将 `DeviceListMasterSelectedType` 这样的枚举进行以下改造: - 重命名为更具表达力的名字(如 `DeviceListFilterType`); - 抽离成单独文件; - 添加辅助属性(如标题、行为标志); - 统一管理国际化支持; 就可以显著减少 ViewController 中的条件判断和字符串拼接,实现真正的 **解耦 + 可维护性提升**。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值