《Swift学习笔记》13 - 属性的简单介绍

介绍:Swift 语言由苹果公司在 2014 年推出,用来撰写 Mac OS 和 iOS 应用程序,并且Swift还是开源的,开源地址:https://github.com/apple/swift,同时附上官方博客地址:https://swift.org
目前Swift已经发展到了第五版本。显然苹果大有推翻 OC “江山”的意思.
今天就来初探一下Swift,看看究竟为何swift有这么大的能力。
参考内容:
Swift中文
YungFan老师

swift

一、属性相关使用

1. 存储属性
  • 存储属性只能由结构体定义。
  • 存储属性和计算属性通常和特定类型的实例相关联。
  • 存储属性要么是变量存储属性(由 var 关键字引入)要么是常量存储属性(由 let 关键字引入)。
// 存储属性
class className {
    let name = "Swift"
    var sex = "男"
    var age = 23
} 

当中的 name sex age都是存储属性 ,一般情况下用 var 关键字定义计算属性——包括只读计算属性——为变量属性,因为它们的值不是固定的

2. 读取和设置存储属性

通过点语法实现

  • 当定义的属性用 let 修饰 那么为不可变的 就 不可以给其赋值
  • 在结构体实例化的时候 如果用 let 修饰 那么,其所有的属性都不可以进行赋值操作, 不论实现是用 let 还是 var 修饰的
// 实例化对象
let swiftName = className()
//swiftName.name = "123" 
swiftName.sex = "女"
print(swiftName.sex) // 女

// 结构体
struct structName{
    var name = "swift"
    var sex = "男"
}
// 用 let 修饰
let otherSwiftName = structName(name: "Swift", sex: "21")
//otherSwiftName.name = "123" // 会报错!
3. 延迟存储属性 懒加载属性
  • 延迟存储属性的初始值在其第一次使用时才进行计算。
  • 你可以通过在其声明前标注 lazy 修饰语来表示一个延迟存储属性。
  • OC中通过重写getter方法去实现
  • 你必须把延迟存储属性声明为变量(使用 var 关键字),因为它的初始值可能在实例初始化完成之前无法取得。常量属性则必须在初始化完成之前有值,因此不能声明为延迟。
class className2 {
    let name = "Swift"
    lazy var sex = "男"
    var age = 23
}

print(className2())

注意: lazy修饰的属性 同时被多个线程访问并且属性还没有被初始化,则无法保证属性只初始化一次。

4. 计算属性

计算属性实际并不存储值。相反,他们提供一个读取器和一个可选的设置器来间接得到和设置其他的属性和值。

// 计算属性
class student {
    var name: String = ""
    var chineseScore : Double = 0.0
    var mathScore : Double = 0.0
    // 计算属性
    var averageScore : Double {
        get {
           return (chineseScore + mathScore) / 2.0
        }
//        set(newAverageScore) {
//            //self.averageScore = newAverageScore
//            self.averageScore = newValue
//        }
        //简写 set 
        set {
            //self.averageScore = newAverageScore
            self.averageScore = newValue
        }
    }
    
}

student().averageScore

let studentClass = student()

studentClass.chineseScore = 10.0
studentClass.mathScore = 12.0
print(studentClass.averageScore)


// 只读计算属性
class student2 {
    var name: String = ""
    var chineseScore : Double = 0.0
    var mathScore : Double = 0.0
    // 计算属性
    var averageScore : Double {
        get {
            return (chineseScore + mathScore) / 2.0
        }
    }
}

let student2Class = student2()
//student2Class.averageScore = 2;
5. 属性观察者
  • 通过 willsetdidset 方法来实现

    • willSet 会在该值被存储之前被调用。
    • didSet 会在一个新值被存储后被调用。
  • OC中通过重写Setter方法实现

  • 如果你实现了一个 willSet 观察者,新的属性值会以常量形式参数传递。你可以在你的 willSet 实现中为这个参数定义名字。如果你没有为它命名,那么它会使用默认的名字 newValue

  • 同样,如果你实现了一个 didSet 观察者,一个包含旧属性值的常量形式参数将会被传递。你可以为它命名,也可以使用默认的形式参数名 oldValue 。如果你在属性自己的 didSet 观察者里给自己赋值,你赋值的新值就会取代刚刚设置的值。

6. 类型属性
  • static 关键字来开一类型属性
  • 对于类类型的计算类型属性,你可以使用 class 关键字来允许子类重写父类的实现。
class SomeClass {
    static var storedTypeProperty = "Some value."
    // 只写了get方法
    static var computedTypeProperty: Int {
        return 27
    }
    // 只写了get方法
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}
  • 类型属性在类里查询和设置,而不是这个类型的实例。
SomeClass.storedTypeProperty = "123"
SomeClass.computedTypeProperty
SomeClass.overrideableComputedTypeProperty
struct AudioChannel {
    static let thresholdLevel = 10
    static var maxInputLevelForAllChannels = 0
    var currentLevel: Int = 0 {
        didSet {
            if currentLevel > AudioChannel.thresholdLevel {
                // cap the new audio level to the threshold level
                currentLevel = AudioChannel.thresholdLevel
            }
            if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                // store this as the new overall maximum input level
                AudioChannel.maxInputLevelForAllChannels = currentLevel
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容