Swift-屬性 (Properties)

  • 存儲(chǔ)屬性
  • 計(jì)算屬性
  • 屬性觀察器
  • 類型屬性
  • 存儲(chǔ)屬性

存儲(chǔ)常量或變量作為實(shí)例的一部分费变,用于結(jié)構(gòu)體摧扇。

            - 常量存儲(chǔ)屬性:let name = value
            - 變量存儲(chǔ)屬性:var name = value
            - 延遲存儲(chǔ)屬性(類似OC懶加載) : lazy var = value

栗子

等下!?? 先談?wù)凷wift中的 問(wèn)號(hào)"?" 挚歧, "!"感嘆號(hào)
問(wèn)號(hào)扛稽?

a.聲明時(shí)添加?滑负,告訴編譯器這個(gè)是Optional的在张,如果聲明時(shí)沒(méi)有手動(dòng)初始化,就自動(dòng)初始化為nil
b.在對(duì)變量值操作前添加矮慕?帮匾,判斷如果變量時(shí)nil,則不響應(yīng)后面的方法痴鳄。

嘆號(hào)瘟斜!

a.聲明時(shí)添加!痪寻,告訴編譯器這個(gè)是Optional的螺句,并且之后對(duì)該變量操作的時(shí)候,都隱式的在操作前添加槽华!
b.在對(duì)變量操作前添加壹蔓!,表示默認(rèn)為非nil猫态,直接解包進(jìn)行處理

所以

可以理解為: '!'修飾的變量不可為nil, '?'修飾的變量可為nil. 所以在訪問(wèn)'!'修飾的變量一旦不小心為nil佣蓉,則Crash

    // MARK: Property
    let name1: String = "String" // 可設(shè)置屬性類型
    let name2 = "sd" // 可不設(shè)置屬性類型
    var namevar1: String? // 可不設(shè)初始值
    var namevar2: String = "namevar2" //可設(shè)置初始值
    var mainView = UIView() // 初始值為一個(gè)UIView對(duì)象
    lazy var label: UILabel = {
        let tempLabel = UILabel()
        // Config
        return tempLabel
    }() //  lazy 創(chuàng)建一個(gè)label
   // MARK: func
    override func viewDidLoad() {
        super.viewDidLoad()
        print("name1=",name1)
        print("name2=",name2)
        print("namevar1=",namevar1) // 若訪問(wèn)為空的屬性,會(huì)報(bào)警告提示 "namevar1 ??             <#default value#>" 
        print("namevar2=",namevar2)
        print("mainView=",mainView)
        print("label=",label)
        /*
         打印結(jié)果:
         name1= String
         name2= sd
         namevar1= nil
         namevar2= namevar2
         mainView= <UIView: 0x7fa2dad09ea0; frame = (0 0; 0 0); layer = <CALayer: 0x600000034200>>
         label= <UILabel: 0x7fa2dad063a0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000092890>>
         */
    }
注意:

必須將延遲存儲(chǔ)屬性聲明成變量(使用 var 關(guān)鍵字)亲雪,因?yàn)閷傩缘某跏贾悼赡茉趯?shí)例構(gòu)造完成之后才會(huì)得到勇凭。而常量屬性在構(gòu)造過(guò)程完成之前必須要有初始值,因此無(wú)法聲明成延遲屬性义辕。

  • 計(jì)算屬性

    類似OC重寫Setter Getter 虾标。
    **類 ** 結(jié)構(gòu)體 枚舉 可定義計(jì)算屬性。
    通常通過(guò)計(jì)算屬性間接獲取或設(shè)置其他屬性 或 變量值灌砖。
栗子

還是拿官方栗子吧(設(shè)置Center可以改變point, 當(dāng)然設(shè)置point size 可獲取center)

“struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    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)
        }
    }
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
    size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// 打印 "square.origin is now at (10.0, 10.0)”

只讀計(jì)算屬性: ( 只有 getter 沒(méi)有 setter聲明可以去掉 getter 關(guān)鍵字和花括號(hào))

    private var width: NSInteger?
    private var height: NSInteger?
    var perimeter: NSInteger {
            return width! + height!
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        width = 10
        height = 10
        print(perimeter) //輸出: 20
    }
注意:

計(jì)算屬性只能使用關(guān)鍵字 var 定義,為毛璧函?因?yàn)樗亲兊摹?/p>

  • 屬性觀察器

    檢測(cè)屬性的變化
    每次屬性被賦值的時(shí)候調(diào)用
    延遲屬性(lazy), 計(jì)算屬性不可直接使用
栗子
/*
// 不賦初始值
var stringData: String?{
        willSet{
        }
        didSet{
        }
}
*/
//賦初始值 演示:
    var stringData: String = "First"{
        willSet{
            print("stringData=",stringData,"newValue=",newValue)
        }
        didSet{
            print("stringData=",stringData,"oldValue=",oldValue)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        stringData = "hello,world"
        /*
         輸出:
         stringData= First newValue= hello,world
         stringData= hello,world oldValue= First
         */
    }
 `willSet` 在新的值被設(shè)置之前調(diào)用(觀察器會(huì)將新的屬性值作為常量參數(shù)傳入”默認(rèn)名稱`newValue`)
 `didSet` 在新的值被設(shè)置之后立即調(diào)用(觀察器會(huì)將舊的屬性值作為參數(shù)傳入傀蚌,可以為該參數(shù)命名或者使用默認(rèn)參數(shù)名 `oldValue`。如果在 didSet 方法中再次對(duì)該屬性賦值蘸吓,那么新值會(huì)覆蓋舊的值善炫。)

任意選哪個(gè)都可,也可全選,視編碼時(shí)具體情況而定

  • 類型屬性

跟實(shí)例的存儲(chǔ)型屬性不同,必須給存儲(chǔ)型類型屬性指定默認(rèn)值
使用關(guān)鍵字 static 來(lái)定義库继,通過(guò)類型本身來(lái)訪問(wèn)
它們只有在第一次被訪問(wèn)的時(shí)候才會(huì)被初始化箩艺。即使它們被多個(gè)線程同時(shí)訪問(wèn),系統(tǒng)也保證只會(huì)對(duì)其進(jìn)行一次初始化宪萄,并且不需要對(duì)其使用 lazy 修飾符艺谆。

栗子

下面栗子演示了“存儲(chǔ)型和計(jì)算型類型屬性的語(yǔ)法:

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
    }
/*
在為類定義計(jì)算型類型屬性時(shí),可以改用關(guān)鍵字 class 來(lái)支持子類對(duì)父類的實(shí)現(xiàn)進(jìn)行重寫
*/
}

官方的一個(gè)很好的栗子,如果你看懂了這個(gè)??.恭喜你兄弟??拜英。你已經(jīng)掌握了Swift的屬性篇.

struct AudioChannel {
    static let thresholdLevel = 10 //“音量的最大上限閾值”常量存儲(chǔ)型類型屬性
    static var maxInputLevelForAllChannels = 0 //“最大音量”變量存儲(chǔ)型類型屬性
    var currentLevel: Int = 0 {
        didSet {
            if currentLevel > AudioChannel.thresholdLevel {
                // 將當(dāng)前音量限制在閥值之內(nèi)(可在這兒直接賦值,放心這不會(huì)造成屬性觀察器被再次調(diào)用)
                currentLevel = AudioChannel.thresholdLevel
            }
            if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                // 存儲(chǔ)當(dāng)前音量作為新的最大輸入音量
                AudioChannel.maxInputLevelForAllChannels = currentLevel
            }
        }
    }
}

總結(jié):

雖然平時(shí)開(kāi)發(fā)中静汤,已經(jīng)編入Swift了。但想好好研究鞏固Swift,所以今天結(jié)合了下官方文檔寫了這篇文章居凶。寫完之后感覺(jué)爽爽噠撒妈。嘿嘿嘿Swift屬性篇完成了,兄弟們?nèi)绻矚g的話,敬請(qǐng)期待我的Swift下一篇文章.別忘點(diǎn)贊啊排监,給哥們動(dòng)力。感謝杰捂!

參考: Swift 舆床、Swift指南

你堅(jiān)持過(guò)很認(rèn)真的做一件事兒?jiǎn)幔繛楹尾辉囋?.....
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫁佳,一起剝皮案震驚了整個(gè)濱河市挨队,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒿往,老刑警劉巖盛垦,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓤漏,居然都是意外死亡腾夯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蔬充,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝶俱,“玉大人,你說(shuō)我怎么就攤上這事饥漫≌ゴ簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵庸队,是天一觀的道長(zhǎng)积蜻。 經(jīng)常有香客問(wèn)我闯割,道長(zhǎng),這世上最難降的妖魔是什么竿拆? 我笑而不...
    開(kāi)封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任宙拉,我火速辦了婚禮,結(jié)果婚禮上如输,老公的妹妹穿的比我還像新娘鼓黔。我一直安慰自己,他們只是感情好不见,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布澳化。 她就那樣靜靜地躺著,像睡著了一般稳吮。 火紅的嫁衣襯著肌膚如雪缎谷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天灶似,我揣著相機(jī)與錄音列林,去河邊找鬼。 笑死酪惭,一個(gè)胖子當(dāng)著我的面吹牛希痴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播春感,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砌创,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鲫懒?” 一聲冷哼從身側(cè)響起嫩实,我...
    開(kāi)封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窥岩,沒(méi)想到半個(gè)月后甲献,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颂翼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年晃洒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朦乏。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锥累,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集歇,到底是詐尸還是另有隱情桶略,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站际歼,受9級(jí)特大地震影響惶翻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹅心,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一吕粗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旭愧,春花似錦颅筋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桃熄,卻和暖如春先口,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞳收。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工碉京, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人螟深。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓谐宙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親界弧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卧惜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語(yǔ)閱讀 3,829評(píng)論 0 6
  • # 屬性 (Properties)本頁(yè)包含內(nèi)容: - 存儲(chǔ)屬性(Stored Properties) - 計(jì)算屬性...
    刺骨寒閱讀 434評(píng)論 1 0
  • ?屬性:將值與特定的類、結(jié)構(gòu)體或枚舉關(guān)聯(lián)夹纫;?存儲(chǔ)屬性:存儲(chǔ)常量或變量作為實(shí)例的一部分;?計(jì)算屬性:用于計(jì)算一個(gè)值(...
    EndEvent閱讀 614評(píng)論 1 5
  • 誰(shuí)說(shuō)看韓劇不用腦子的月匣,請(qǐng)回答系列的猜老公過(guò)程不知道消耗了我們這些腦殘粉的多少腦細(xì)胞。有些粉絲甚至發(fā)展了自己的推理潛...
    木槿芬飛閱讀 834評(píng)論 0 4
  • 那天我和洛倫齊尼說(shuō)我要成為一個(gè)人奋姿。 像人那樣去品嘗食物的味道锄开,體驗(yàn)風(fēng)在皮膚汗毛上留下的觸動(dòng),聽(tīng)清遠(yuǎn)處輪胎和路面的摩...
    咸菜來(lái)一把閱讀 4,274評(píng)論 1 4