美文网首页
Swift-OOP-Property

Swift-OOP-Property

作者: 守护地中海的花 | 来源:发表于2020-11-19 21:01 被阅读0次

概念

存储属性(Stored Property)

  • 类似于成员变量的这个概念
  • 存储在实例的内存中
  • 结构体、类可以定义存储属性
  • 枚举不可定义存储属性
  • 在创建类或结构体的实例时,必须为所有的存储属性设置一个合适的初始值
  • 可以在初始化器里为存储属性设置一个初始值
  • 可以分配一个默认的属性值作为属性定义的一部分

计算属性(Computed Property)

  • 本质就是方法(函数)
  • 不占用实例的内存
  • 枚举、结构体、类都可以定义计算属性
  • 计算属性只能用var不能let,let代表常量:值是一成不变的。计算属性的值是可能发生变化的(即使是只读计算属性)
struct Circle {
    //存储属性
    var radius : Double
    //计算属性
    var diameter:Double {
        set {
            radius = newValue / 2
        }
        get {
            radius * 2
        }
    }
}
var circle = Circle(radius: 10)
print(circle.radius)
print(circle.diameter)

计算属性

image.png

set可以没有 get必须有

set-newValue

set 传入的新值默认叫做newValue,也可以自定义

set(newDiameter) {
    radius = newDiameter / 2
}

get

只读 赋值报错
struct Circle1 {
    var radius: Double
    var diameter:Double {
        get {
            radius * 2
        }
    }
}

var circle1 = Circle1(radius: 10)
print(circle1.diameter)

简写

var diameter:Double {
    radius * 2
}

延迟存储属性

image.png
class Car {
    init() {
        print("Car init!")
    }
    func run() {
        print("Car is running!")
    }
}
let car = Car()
car.run()

class Person {
    lazy var car = Car()
    init() {
        print("Person init")
    }
    func goOut() {
        car.run()
    }
}
let person = Person()
person.goOut()
  • 使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
  • 当结构体包含一个延迟存储属性时,只有var 才能访问延迟存储属性,因为延迟属性初始化时需要改变结构体的内存
struct Point {
    var x:Int = 0
    var y:Int = 0
    lazy var z = 0
}
var point = Point()
point.z = 0

属性观察器 (Property Observer)

  • 必须初始化哦
  • 可以为非lazy的var存储属性设置属性观察器
  • willSet会传递新值,默认叫newValue
  • didSet会传递旧值,默认叫oldValue
  • 在初始化器中设置属性值不会触发willSet和didSet
  • 在属性定义时设置初始化值也不会willSet和didSet

结构体里面

func PropertyObserver() {
    
    struct Circle {
        var radius : Double {
            willSet {
                print("willSet",newValue)
            }
            didSet {
                print("didSet",oldValue,radius)
            }
        }
        init() {
            self.radius = 1.0
            print("Circle init!")
        }
    }
    
    var circle = Circle()
    print(circle.radius)
    circle.radius = 2.0
    
    
}

变量中应用 (需要初始化哦)

var num1:Int = 10{
    willSet {
        print("willSet",newValue)
    }
    didSet {
        print("didSet oldValue = \(oldValue)")
    }
}
num1 = 300
print(num1)

类型属性

struct Dog {
    static var count:Int = 0
    init() {
        Dog.count += 1
    }
}

let dog = Dog()
print(Dog.count)

相关文章

  • Swift-OOP-Property

    概念 存储属性(Stored Property) 类似于成员变量的这个概念 存储在实例的内存中 结构体、类可以定义...

网友评论

      本文标题:Swift-OOP-Property

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