加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift学习笔记系列——(9)属性

发布时间:2020-12-14 02:00:40 所属栏目:百科 来源:网络整理
导读:Tags: Swift 学习笔记 发布时间:2015-07-17 修改时间:2015-07-17 作者:Erwin 博客地址:技术杂货铺 欢迎转载,转载请注明出处。 Swift学习笔记系列——(9)属性 属性关联数据到特定的 类 、 结构体 、或者 枚举 。 存储属性 存储属性可以是常量,也可以

Tags: Swift 学习笔记

发布时间:2015-07-17
修改时间:2015-07-17
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。

Swift学习笔记系列——(9)属性

属性关联数据到特定的结构体、或者枚举

存储属性

存储属性可以是常量,也可以是变量。
可以给存储属性提供默认值。初始化的时候可以设置和修改存储属性的值,对于常量存储属性也适用。

常量结构体实例的存储属性

结构体实例被赋值给一个常量,即使该结构体的属性被声明为变量,也不能对其属性进行修改。
这从侧面证明了结构体是值类型的,同样的情形不会出现在类上。

惰性存储属性

用lazy关键字标记。
第一次被使用时才会被初始化的属性。
多线程一起访问一个未初始化的惰性存储属性时,不能保证该属性只被初始化一次。

存储属性和实例变量

OC中可以用属性和实例变量存储数据。
不同于OC,Swift将二者同一起来。

计算属性

除了存储属性,类、结构体和枚举可以定义计算属性,计算属性并不存储值,而是提供了getter和可选的setter来间接地获取或设置其他属性或者值。
计算属性必须是变量
setter可以省略,属性变为只读

计算属性写法

var center: Point {
    get {
        let centerX = origin.x + (size.width / 2)
        let centerY = origin.y + (size.height / 2)
        return Point(x: centerX,y: centerY)
    }
    set(newCenter) {
        origin.x = newCenter.x - (size.width / 2)
        origin.y = newCenter.y - (size.height / 2)
    }
}

计算属性简写

setter有默认参数newValue,可以省去不写

var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX,y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }

属性观察者

属性观察者观察和响应一个属性的值的改变。
即使是赋予的新值和原来的值相同,照样可以触发观察者的行为。
初始化赋值时不会触发观察者的行为。
didSet观察者中修改属性值,不会触发观察者行为。
自己定义的任意存储属性(惰性存储属性除外)都可以加观察者。
继承来的属性不论是存储属性还是计算属性都可以添加观察者。
没有必要给非继承的计算属性添加观察者,因为一切皆在你掌握。

两种观察者可以随意选用

willSet 在值被存储前调用;
didSet 在值被存储后被调用。
willSet的默认参数:newValue,表示新赋予的值。
didSet 的默认参数:oldValue,表示原来的值。

观察者写法

var totalSteps: Int = 0 {
    willSet(newTotalSteps) {
    print("About to set totalSteps to (newTotalSteps)")
    }
    didSet {
        if totalSteps > oldValue  {
            print("Added (totalSteps - oldValue) steps")
        }
    }
}

全局和本地变量

全局变量是不定义在任何函数、方法、闭包或者类型中的变量。
本地变量是定义在函数、方法或者闭包中的变量。
全局和本地变量也可以有计算属性和属性观察者的功能。
全局常量和变量通常都是惰性计算的,而且不需要声明为lazy。
本地变量和常量都不能惰性计算。

类型属性

类型属性在其他语言叫做静态属性。存储的类型属性可以是常量也可以是变量,但是必须给出初始值,因为类型属性没有机会初始化。

类型属性的语法

可以用static关键字定义类型属性。对于类类型的计算属性,如果要允许子类复写超类实现,需要用class关键字将其定义为类型属性。

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 6
    }
}
class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

这里没有可读写的计算属性例子,以后要加上。

使用和设置类型属性

用“类型名.属性名”访问和设置类型属性

本章思维导图

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读