Swift 属性

You can't connect the dots looking forward; you can only connect them looking backwards.
-- Steve Jobs

说一下Swift的属性。

??,这有什么好说的?.jpeg

很久没有跟人聊概念技术尤其是耳熟能详的概念,仔细一想,这属性到底是啥?

我知道你问的是啥,我也知道是啥,但我不知道你想让我说啥,尴尬了。

属性:是描述一个事物的特征?我都怀疑我还是不是不爱说话的程序员了...

比方说抽象一个Person类,定义一个Int的age就是属性。

class Person {
    var age: Int
}

struct Point {
    var x: Int
    var y: Int
}

在Swift中,通过实例访问的属性称为实例属性,通过类名访问的属性称为类型属性

实例属性分存储属性计算属性。存储属性类似成员变量存储在实例的内存中;计算属性本质是方法不占用实例的内存。

存储属性

存储属性规定:在创建类、结构体的实例时,必须为所有的存储属性设置一个合适的初始值。使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化。

lazy属性必须是var,多线程访问不能保证只初始化一次。结构体实例需要定义为var,因为延迟属性初始化时需改变结构体内存。

计算属性

定义计算属性只能是var,不能用let。
set传入的新值默认是newValue,也可以自定义。
只有get,没有set就是只读计算属性。

类型属性也分存储类型属性计算类型属性。存储类型属性相当于全局变量,整个程序运行过程中只有一份内存,用static修饰;计算类型属性相当于全局函数。用static/class修饰。static修饰的不能被子类重写,class修饰的可以重写。

存储类型属性

默认lazy且线程安全(调用dispatch_once_f),第一次使用时才初始化

计算类型属性

默认lazy且线程安全

class Person {
    var gender: String //存储属性
    //计算属性 
    //根据gender是男是女算出sex值,方便传给后台Bool值,设置sex时同时改变gender的值
    var sex: Bool { 
        set {
            gender =  newValue ? "男" : "女"
        }
        get {
            gender == "男"
        }
    }
    //存储类型属性
    static var count: Int = 0
    //计算存储类型
    static var hands: Int {
        get {
            count * 2
        }
    }
    //懒加载存储属性,延迟加载
    lazy var pet = Pet()
    var cloth = Cloth()
    
    init(gender: String) {
        self.gender = gender
    }
}

class Pet {
    var name: String = "旺财"
    init() {
        //用到的时候初始化
        print("Pet init")
    }
}

class Cloth {
    init() {
        print("Cloth init")
    }
}

属性观察器

为非lazy的var存储属性社会属性观察器,初始化器中设置属性值(设置初始值)不会触发属性观察器

var age: Int {
        willSet {
            print("willset", newValue)
        }
        didSet {
            print("didset", oldValue, radius)
        }
    }

重写属性

存储属性、计算属性重写为计算属性,只能重写var属性,子类重写后的属性的权限不能小于父类的。被final修饰的属性禁止被重写。

可以在子类中为父类属性增加属性观察器(只读、let除外)
存储属性没有属性观察器的增加属性观察器,有属性观察器的调用顺序子类的willSet->父willSet->父didSet->子类的didSet

计算属性先要获取oldValue,所以顺序是get->sub willSet->set->get->sub didSet

class Person {
    class var age: Int {
        set {
            print("set", newValue)
        }
        get {
            print("get")
            return 18
        }
    }
}

class Student: Person {
    override static var age: Int {
        willSet {
            print("Sub willset", newValue)
        }
        didSet {
            print("Subdidset", oldValue, age)
        }
    }
}

var s = Student()
Student.age = 19
/*
get
Sub willset 19
set 19
get
Subdidset 18 18
*/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 中文文档 一、存储属性 一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。 存储属性可以是变量存储属性(...
    伯wen阅读 197评论 0 0
  • 原文博客地址: 浅谈Swift的属性(Property) 今年期待已久的Swift5.0稳定版就已经发布了, 感兴...
    TitanCoder阅读 1,674评论 0 6
  • 属性将值与特定类,结构或枚举相关联; 存储和计算属性通常与特定类型的实例相关联。但是属性也可以和类型本身相关联(类...
    WSJay阅读 2,941评论 0 2
  • Swift属性分为存储属性,计算属性。或者分为实例属性,类属性。计算属性不存储值(像是一个计算方法),枚举没有存储...
    dongwenbo阅读 253评论 0 0
  • 什么是属性? 属性将值跟特定的类、结构体或枚举关联。存储属性存储常量或变量为实例的一部分,而计算属性计算(不是存储...
    GY1994阅读 341评论 0 2