美文网首页Swift 基础
Swift Lazy 和类型属性

Swift Lazy 和类型属性

作者: 幸运者_Lucky | 来源:发表于2020-08-04 15:51 被阅读0次

If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there’s no guarantee that the property will be initialized only once.
Lazy 不是线程安全的!

struct A {
    lazy var a: Int = {
        return Int.random(in: 0 ... 1000)
    }()
}

var a = A()

for _ in 0 ..< 100 {
    DispatchQueue.global().async {
        print(a.a)
    }
}

// print
952
119
756
248
997

Unlike stored instance properties, you must always give stored type properties a default value. This is because the type itself does not have an initializer that can assign a value to a stored type property at initialization time.

Stored type properties are lazily initialized on their first access. They are guaranteed to be initialized only once, even when accessed by multiple threads simultaneously, and they do not need to be marked with the lazy modifier.

  1. 类型属性是线程安全的, 并且是 Lazy 的. 如下打印.
  2. 可以用 class 来替换 static, 它不能以 = 的方式初始化, 必须提供具体的实现,
    否则会报错, 提示使用 static 来代替, class 标记的类型属性, 是可以被子类型重写的, 这是主要的区别, 值类型(struct, enum) 等是没法使用 class 标记的类型属性, 没有继承.
class Temp {}

class A {
    static var p1 = "???"
    static var p2: String {
        return "?????"
    }
    
    class var p3: String {
        return "??????"
    }
}

class AA: A {
    override init() {
        super.init()
        print("A init")
    }
    
    override class var p3: String {
        return "p3 ??????"
    }
    
    class var p4: Temp {
        return Temp()
    }
    
    static var p5 = Temp()
}

struct B {
    static let a = 10
    static let aa = AA()
    init() {
        print("B init")
    }
}

_ = B()
B.aa
B.aa

// print
B init
A init

相关文章

  • Swift Lazy 和类型属性

    If a property marked with the lazy modifier is accessed b...

  • Swift: lazy 属性的写法

    序言:OC中有懒加载,Swift中用lazy关键字声明属性,也可以实现懒加载。lazy所修饰的属性只有第一次访问时...

  • Swift 延迟属性 lazy

    惰性初始化的使用场景 属性本身依赖于外部因素才能初始化属性需要复杂计算,消耗大量CPU属性不确定是否会使用到定制化...

  • 每天学一点Swift----面向对象上(十一)

    十三.类型属性和类型方法 1.通过前面的学习,已经知道Swift的类型中有5种成员:属性(存储属性和计算属性)、方...

  • swift3.0 - 懒加载

    和OC不同的是swift有专门的关键字来实现懒加载 lazy关键字可以用于定义某一个属性懒加载 格式: lazy ...

  • Swift笔记(一)属性、析构、调用OC单例

    目录 swift属性存储属性懒加载属性计算属性属性监听类型属性 swift析构函数 swift调用OC单例类方法 ...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift 学习笔记(三)

    Swift属性 Swift属性将值跟特定的类,结构体,枚举关联。分为存储属性和计算属性,通常用于特定类型的实例。属...

  • Swift 类型属性、类型方法

    简述 Swift中的类型(class、struct、enum等)属性和类型方法分别属于静态属性和静态方法。这种类型...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

网友评论

    本文标题:Swift Lazy 和类型属性

    本文链接:https://www.haomeiwen.com/subject/qichrktx.html