Swift错误:实例方法'get'要求'Never'遵循'DefaultsSerializable'协议
SwiftyUserDefaults配置错误:Instance method 'get' requires that 'Never' conform to 'DefaultsSerializable'
问题场景
在项目中配置SwiftyUserDefaults时,完成了以下操作:
- 定义遵循
DefaultsSerializable协议的UserMode枚举 - 扩展
DefaultsKey添加userMode键 - 编写包含
get、set方法的UserDefaultService类
但在ViewModel中调用get方法获取默认用户模式时,触发错误:Instance method 'get' requires that 'Never' conform to 'DefaultsSerializable'
相关代码如下:
UserMode枚举及DefaultsKey扩展
import Foundation import SwiftyUserDefaults public enum UserMode: String, DefaultsSerializable { public static var _defaults: DefaultsRawRepresentableBridge<UserMode> { .init() } public static var _defaultsArray: DefaultsRawRepresentableArrayBridge<[UserMode]> { .init() } case normal = "normal" case admin = "admin" } public extension DefaultsKey { var userMode: DefaultsKey<UserMode> { .init("userMode", defaultValue: .normal)} }
UserDefaultService类
import Foundation import SwiftyUserDefaults public class UserDefaultService { public func get<T: DefaultsSerializable>(_ keyPath: ReferenceWritableKeyPath<DefaultsAdapter<DefaultsKeys>, T>) -> T { Defaults[keyPath: keyPath] } public func set<T: DefaultsSerializable>(_ keyPath: ReferenceWritableKeyPath<DefaultsAdapter<DefaultsKeys>, T>, value: T) { Defaults[keyPath: keyPath] = value } }
错误原因
问题出在DefaultsKey的扩展中:你使用了**实例属性var定义userMode,但SwiftyUserDefaults要求用静态属性static var**声明默认键。
DefaultsAdapter的keyPath是关联DefaultsKeys的静态属性的,使用实例属性会导致编译器无法正确推导T的类型,最终将其推断为Never,从而触发错误。
解决方案
修改DefaultsKey扩展,将var改为static var:
public extension DefaultsKey { static var userMode: DefaultsKey<UserMode> { .init("userMode", defaultValue: .normal)} }
修改后,在ViewModel中调用UserDefaultService的get方法即可正常使用:
let service = UserDefaultService() let mode = service.get(\.userMode)
如果不需要自定义的UserDefaultService,也可以直接使用SwiftyUserDefaults的原生语法,更简洁:
// 获取用户模式 let mode = Defaults[\.userMode] // 设置用户模式 Defaults[\.userMode] = .admin
内容的提问来源于stack exchange,提问作者Zin Win Htet
相关产品推荐
相关产品推荐

