如何精简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
相关产品推荐
相关产品推荐

