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
相关产品推荐
相关产品推荐

