SwiftProperty Swift3.0 屬性

Swift Peoperty

Swift中有下列幾種屬性

  1. 存儲屬性(Stored properties):存儲實例的常量和變量,與類、結(jié)構(gòu)體赃承、枚舉的實例相關(guān)
  2. 計算屬性(Computed properties):通過某種方式計算出來的屬性毒租,只與類、結(jié)構(gòu)體的實例相關(guān)衰伯,枚舉沒有計算屬性
  3. 類型屬性(type properties):與類型自身相關(guān)

存儲屬性

存儲屬性是最簡單的屬性铡羡,它作為類或結(jié)構(gòu)體實例的一部分,用于存儲常量和變量

關(guān)于存儲屬性意鲸,有以下幾點:

  1. 我們可以給存儲屬性提供一個默認值烦周,也可以在初始化方法中對其進行初始化,即使是常量型屬性怎顾,也可以這樣做读慎。
  2. 如果創(chuàng)建一個常量結(jié)構(gòu)體實例,我們不能修改該實例的變量型存儲屬性槐雾。這是因為結(jié)構(gòu)體是值類型夭委,當一個值類型的實例標記為常量時,它的所有屬性也是常量募强。由于類是引用類型株灸,所以該條不適用于類類型崇摄。
  3. 如果我們希望屬性在使用到的時候再初始化,則可以使用懶惰存儲屬性(lazy stored property慌烧,使用修飾符@lazy)配猫。懶惰存儲屬性總是應(yīng)該定義為變量,因為常量型屬性總需要在初始化方法完成之前初始化杏死。
  4. 與Objective-C不同的是泵肄,Swift中的屬性不需要一個與之對應(yīng)的成員變量,我們不能直接訪問屬性的后備存儲(backing store)淑翼。這種方式避免了混淆不同上下文環(huán)境下對值的訪問腐巢,并將屬性簡化為單一、明確的聲明玄括。
struct FixedLengthRange {
  var firstValue: Int   //變量存儲屬性
  let length: Int       //常量存儲屬性
}

var item1 = FixedLengthRange(firstValue: 10, length: 10)
    
let item2 = FixedLengthRange(firstValue: 10, length: 10)

//item2.firstValue = 6       // 錯誤:不能修改常量結(jié)構(gòu)體實例的存儲屬性

計算屬性

計算屬性并不存儲實際的值冯丙,而是提供一個getter和一個可選的[ setter來間接獲取和設(shè)置其它屬性 ]。

關(guān)于計算屬性遭京,有以下幾點:

  1. 如果計算屬性的setter沒有定義一個新值的變量名胃惜,則默認為newValue
  2. 如果只提供getter,而不提供setter哪雕,則該計算屬性為只讀屬性
  3. 我們只能聲明變量型只讀屬性船殉,因為它們的值不是固定的
  4. 如果計算屬性是只讀的,則可以不使用get{}
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) {            // 若不提供新值變量名斯嚎,則默認為newValue
            origin.x = newCenter.x - size.width / 2
            origin.y = newCenter.y - size.height / 2
        }
    }
    
    var maxX:Float {        // 只讀屬性利虫,省略get{}
        return Float(origin.x) + Float(size.width)
    }
}
    
var square = Rect(origin:Point(x: 0.0, y: 0.0), size:Size(width:100, height:100))
    
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y:15.0)
square.maxX

類型屬性

類型屬性是與類型相關(guān)聯(lián)的,而不是與類型的實例相關(guān)聯(lián)堡僻】繁梗— 與類型相關(guān)不與對象相關(guān)對于某一類型(class)的所有實例,類型(class)屬性都只有一份拷貝钉疫。對于值類型(struct)硼讽,我們可以定義存儲類型屬性和計算類型屬性。對于類(class)牲阁,我們只能定義計算類型(setter)屬性固阁。和實例屬性不同的是,我們總是需要給存儲類型(getter)屬性一個默認值咨油。這是因為類型沒有初始化方法來初始化類型屬性您炉。

類型屬性的訪問和設(shè)置與實例屬性一樣柒爵,不一樣的是役电,類型屬性通過類型來獲取和設(shè)置,而不是類型的實例

關(guān)鍵字 : class static

struct AudioChannel {
    static let threaholdLevel = 10
    static var maxInputLevelForAllChannels = 0
    
    var currentLevel:Int = 0 {
        didSet{
            if currentLevel > AudioChannel.threaholdLevel {
                currentLevel = AudioChannel.threaholdLevel
            }
            
            if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                AudioChannel.maxInputLevelForAllChannels = currentLevel
            }
        }
    }
}
    
var leftChannel = AudioChannel()
var rightChannel = AudioChannel()
    
leftChannel.currentLevel = 7
    
println(leftChannel.currentLevel)       // 7
println(AudioChannel.maxInputLevelForAllChannels)   // 7
    
rightChannel.currentLevel = 11
println(rightChannel.currentLevel)      // 10

屬性觀察者

屬性觀察者用于監(jiān)聽和響應(yīng)屬性值的變化棉胀。在每次設(shè)置屬性值的時候都會調(diào)用屬性觀察者方法法瑟,即使新舊值是一樣的冀膝。我們可以為任何存儲屬性定義屬性觀察者,除了懶惰存儲屬性霎挟。我們同樣可以在子類中給繼承而來的屬性添加觀察者窝剖。

對于計算屬性,我們不需要定義屬性觀察者酥夭,因為我們可以在計算屬性的setter中直接觀察并響應(yīng)這種值的變化。

我們通過設(shè)置以下觀察方法來定義觀察者

  1. willSet:在屬性值被存儲之前設(shè)置。此時新屬性值作為一個常量參數(shù)被傳入啰扛。該參數(shù)名默認為newValue璧坟,我們可以自己定義該參數(shù)名
  2. 在新屬性值被存儲后立即調(diào)用。與willSet相同讶隐,此時傳入的是屬性的舊值起胰,默認參數(shù)名為oldValue

willSet與didSet只有在屬性第一次被設(shè)置時才會調(diào)用,在初始化時巫延,不會去調(diào)用這些監(jiān)聽方法效五。

轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炉峰,隨后出現(xiàn)的幾起案子畏妖,更是在濱河造成了極大的恐慌,老刑警劉巖疼阔,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜客,死亡現(xiàn)場離奇詭異,居然都是意外死亡竿开,警方通過查閱死者的電腦和手機谱仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來否彩,“玉大人疯攒,你說我怎么就攤上這事×欣螅” “怎么了敬尺?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贴浙。 經(jīng)常有香客問我砂吞,道長,這世上最難降的妖魔是什么崎溃? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任蜻直,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘概而。我一直安慰自己呼巷,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布赎瑰。 她就那樣靜靜地躺著王悍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪餐曼。 梳的紋絲不亂的頭發(fā)上压储,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音源譬,去河邊找鬼渠脉。 笑死,一個胖子當著我的面吹牛瓶佳,可吹牛的內(nèi)容都是我干的芋膘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼霸饲,長吁一口氣:“原來是場噩夢啊……” “哼为朋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厚脉,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤习寸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傻工,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞溪,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年中捆,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸯匹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泄伪,死狀恐怖殴蓬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟋滴,我是刑警寧澤染厅,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站津函,受9級特大地震影響肖粮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尔苦,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一涩馆、第九天 我趴在偏房一處隱蔽的房頂上張望行施。 院中可真熱鬧,春花似錦凌净、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皿渗,卻和暖如春斩芭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乐疆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工划乖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挤土。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓琴庵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仰美。 傳聞我的和親對象是個殘疾皇子迷殿,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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