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

Swift中lazy、get与didSet能否结合使用?功能失效求助

问题原因与解决方案

你的代码存在两个关键问题:

1. Lazy属性与didSet的语法错误

你当前的写法将didSet的大括号直接跟在lazy初始化赋值后,不符合Swift语法规范,导致didSet观察器无法被正确识别,自然不会触发。

2. 初始化时didSet不会触发(正常行为,但需注意)

Swift中,存储属性的didSet只会在属性被重新赋值时触发,第一次lazy初始化(首次访问属性时)不会调用didSet。如果需要首次加载后也刷新界面,需手动补充逻辑。


修正后的代码

class CoreDataManager {
    func fetchUsers() -> [UserEntity] {
        var users: [UserEntity] = []
        do {
            // 替换try!为try,避免崩溃
            users = try context.fetch(UserEntity.fetchRequest())
        } catch {
            print("Fetch user Error,", error)
        }
        return users
    }
}


protocol UserControllerToViewModel: AnyObject {
    func reloadData()
}


class UserViewModel {
    private var manager = CoreDataManager()
    weak var delegate: UserControllerToViewModel?

    // 正确的lazy + didSet写法
    lazy var users: [UserEntity] = {
        let fetchedUsers = manager.fetchUsers()
        // 首次加载后手动调用刷新(可选,根据需求添加)
        delegate?.reloadData()
        return fetchedUsers
    }()
    didSet {
        // 数组被修改(包括append/remove等操作,因为数组是值类型)时触发
        delegate?.reloadData()
    }
}

额外说明

  • 数组是值类型,调用append、remove等修改方法时,本质是生成新的数组实例替换原属性值,因此会触发didSet。
  • 若首次加载时delegate尚未赋值,手动调用reloadData会无效,建议在设置delegate后,主动调用一次delegate?.reloadData(),或延迟访问users属性直到delegate配置完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:05:38