You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift技术问询:枚举映射UISegmentedControl的更优实现方式

更具Swift风格的UISegmentedControl刷新速率枚举实现方案

你的现有代码已经是合理的实现,但我们可以通过几个Swift特有的语法和设计思路,让代码更简洁、安全且语义化。下面是优化后的方案:

优化后的枚举实现

import UIKit

enum RefreshRate: Int {
    // 对应分段控件的三个位置索引
    case sixty = 0
    case thirty
    case fifteen

    // 用计算属性替代方法,更符合Swift的属性语义
    var interval: TimeInterval {
        switch self {
        case .sixty: return 3600.0
        case .thirty: return 1800.0
        case .fifteen: return 900.0
        }
    }

    // 静态属性存储UserDefaults键,消除魔法字符串
    static let userDefaultsKey = "refreshRate"

    // 自定义初始化:自动从UserDefaults读取,提供默认值
    init(fromUserDefaults defaults: UserDefaults = .standard) {
        let savedRawValue = defaults.integer(forKey: Self.userDefaultsKey)
        self = Self(rawValue: savedRawValue) ?? .sixty
    }

    // 可选:添加分段控件标题属性,统一管理显示文本
    var segmentTitle: String {
        switch self {
        case .sixty: return "60秒"
        case .thirty: return "30秒"
        case .fifteen: return "15秒"
        }
    }
}

简化的使用方式

现在调用代码会变得非常简洁,而且不需要处理可选值:

// 自动从UserDefaults读取,默认返回.sixty
let selectedRefreshRate = RefreshRate()
// 直接获取时间间隔
let refreshInterval = selectedRefreshRate.interval

// 可选:设置分段控件标题时也能统一使用枚举
let segmentedControl = UISegmentedControl(items: [
    RefreshRate.sixty.segmentTitle,
    RefreshRate.thirty.segmentTitle,
    RefreshRate.fifteen.segmentTitle
])

优化点说明

  • 用计算属性替代方法:interval作为只读计算属性,比refreshEvery()更符合Swift的设计习惯——它描述的是枚举值的固有属性,而非一个需要执行的动作。
  • 消除魔法字符串:把UserDefaults的键作为枚举的静态属性,避免硬编码,后续修改时只需改一处,也减少了拼写错误的可能。
  • 安全的初始化逻辑:自定义初始化方法自动处理UserDefaults的读取,并且在存储值无效时返回默认选项,彻底消除了可选值的处理成本。
  • 语义化类型:使用TimeInterval(Swift标准库中Double的别名,专门表示时间间隔)替代直接用Double,让代码意图更清晰。
  • 统一管理UI文本:新增的segmentTitle属性可以让分段控件的标题和枚举逻辑绑定,避免UI文本和业务逻辑脱节。

原代码的核心逻辑没问题,这些优化只是让它更贴合Swift的“简洁、安全、表达力强”的设计哲学。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:55:18