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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:33:10