在Swift中,为什么分配给静态变量也会调用它的getter
据我所知,在
Swift中,静态变量是隐式的:
https://stackoverflow.com/a/34667272/1672161
但我不清楚为什么会这样: protocol HatType {} class Hat: HatType { init() { print("real hat") } } class MockHat: HatType { init() { print("mock hat") } } struct HatInjector { static var hat: HatType = Hat() } HatInjector.hat = MockHat() // Output: // real hat // mock hat 我所看到的是,对静态var的赋值也在某种意义上调用了getter.这对我来说并不直观.这里发生了什么?为什么这项任务不会发生? 解决方法
这是因为静态和全局存储变量当前(这可能会发生变化)仅由编译器给出一个访问器 – unsafeMutableAddressor,它获取指向变量存储的指针(可以看到
by examining the SIL or IR emitted).
这个访问者: >获取指向编译器生成的全局标志的指针,该标志确定静态变量是否已初始化. 所以它或多或少地相当于Objective-C线程安全的延迟初始化模式: +(Hat*) hat { static Hat* sharedHat = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate,^{ sharedHat = [[Hat alloc] init]; }); return sharedHat; } 主要区别在于Swift返回指向sharedHat(指向引用的指针)存储的指针,而不是sharedHat本身(只是对实例的引用). 因为这是静态和全局存储变量的唯一访问器,为了执行赋值,Swift需要调用它以获取指向存储的指针.因此,如果它尚未初始化 – 访问者需要首先将其初始化为其默认值(因为它不知道调用者将使用它做什么),然后调用者将其设置为另一个值. 这种行为确实有点不直观,并且一直是filed as a bug.正如乔丹·罗斯在报告的评论中所说:
所以这种行为很可能在未来的语言版本中发生变化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |