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

如何精简Swift中重复的UserDefaults及输入框配置代码?

Swift 重复代码精简方案

核心思路是把需要统一处理的输入框放到数组里,通过遍历+映射的方式批量操作,避免重复写相同逻辑。

1. 批量设置输入框属性(clearsOnBeginEditing + inputAccessoryView)

把所有目标输入框存入数组,一次遍历完成两个属性的设置:

// 先定义所有需要处理的输入框数组
let targetTextFields = [nameTextField, ageTextField, emailTextField]

// 批量设置 clearsOnBeginEditing
targetTextFields.forEach { $0.clearsOnBeginEditing = true }

// 批量设置 inputAccessoryView(先提前创建好你的辅助视图)
let customAccessoryView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
// 给辅助视图加按钮等逻辑...

targetTextFields.forEach { $0.inputAccessoryView = customAccessoryView }

2. 批量存入UserDefaults

通过输入框-存储键的映射字典,批量完成存储操作:

// 建立输入框和对应存储键的映射
let textFieldKeyMap: [UITextField: String] = [
    nameTextField: "user_name",
    ageTextField: "user_age",
    emailTextField: "user_email"
]

let defaults = UserDefaults.standard
textFieldKeyMap.forEach { textField, key in
    defaults.set(textField.text, forKey: key)
}
// iOS 10+ 自动同步,若需兼容低版本可调用 defaults.synchronize()

3. 批量从UserDefaults读取赋值

复用上面的映射字典,反向遍历赋值:

let defaults = UserDefaults.standard
textFieldKeyMap.forEach { textField, key in
    textField.text = defaults.string(forKey: key)
}

进阶优化:给UITextField扩展存储键

如果不想每次都写映射字典,可以给UITextField加个关联属性,直接绑定存储键:

// 先实现一个通用的关联对象工具类
final class ObjectAssociation<T: AnyObject> {
    private let policy: objc_AssociationPolicy
    
    init(policy: objc_AssociationPolicy = .OBJC_ASSOCIATION_RETAIN_NONATOMIC) {
        self.policy = policy
    }
    
    subscript(index: AnyObject) -> T? {
        get { objc_getAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque()) as? T }
        set { objc_setAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque(), newValue, policy) }
    }
}

// 给UITextField扩展存储键属性
extension UITextField {
    private static let storageKeyAssociation = ObjectAssociation<String>()
    
    /// 绑定UserDefaults存储键
    var storageKey: String? {
        get { UITextField.storageKeyAssociation[self] }
        set { UITextField.storageKeyAssociation[self] = newValue }
    }
}

// 使用示例:给输入框绑定键
nameTextField.storageKey = "user_name"
ageTextField.storageKey = "user_age"
emailTextField.storageKey = "user_email"

// 批量存储
targetTextFields.forEach {
    guard let key = $0.storageKey else { return }
    UserDefaults.standard.set($0.text, forKey: key)
}

// 批量读取
targetTextFields.forEach {
    guard let key = $0.storageKey else { return }
    $0.text = UserDefaults.standard.string(forKey: key)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:50:25