Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在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).

这个访问者:

>获取指向编译器生成的全局标志的指针,该标志确定静态变量是否已初始化.
>使用此指针调用swift_once,以及初始化静态变量的函数(这是您给它的初始化表达式,即= Hat()).在Apple平台上,swift_once只是forwards onto dispatch_once_f.
>返回指向静态变量存储的指针,然后调用者可以自由读取和变异 – 因为存储具有静态生存期.

所以它或多或少地相当于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.正如乔丹·罗斯在报告的评论中所说:

所以这种行为很可能在未来的语言版本中发生变化.

大佬总结

以上是大佬教程为你收集整理的在Swift中,为什么分配给静态变量也会调用它的getter全部内容,希望文章能够帮你解决在Swift中,为什么分配给静态变量也会调用它的getter所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。