日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】Swift属性Property

發(fā)布時間:2023/12/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】Swift属性Property 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文系轉(zhuǎn)載 原文鏈接

Swift的屬性與Objective-C中的屬性是一樣的,不同的是Swift細(xì)化了屬性的類型,另外除了類之外,結(jié)構(gòu)體和枚舉也可以有屬性。

Swift中有這么幾種屬性:

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

另外,我們可以定義屬性觀察者來監(jiān)聽屬性值的改變,以執(zhí)行一些額外的操作。屬性觀察者可以添加到自定義的存儲屬性上,也可以添加到父類繼承而來的屬性上。

下面我們將詳細(xì)介紹這些屬性

存儲屬性

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

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

  • 我們可以給存儲屬性提供一個默認(rèn)值,也可以在初始化方法中對其進行初始化,即使是常量型屬性,也可以這樣做。
  • 如果創(chuàng)建一個常量結(jié)構(gòu)體實例,我們不能修改該實例的變量型存儲屬性。這是因為結(jié)構(gòu)體是值類型,當(dāng)一個值類型的實例標(biāo)記為常量時,它的所有屬性也是常量。由于類是引用類型,所以該條不適用于類類型。
  • 如果我們希望屬性在使用到的時候再初始化,則可以使用懶惰存儲屬性(lazy stored property,使用修飾符@lazy)。懶惰存儲屬性總是應(yīng)該定義為變量,因為常量型屬性總需要在初始化方法完成之前初始化。
  • 與Objective-C不同的是,Swift中的屬性不需要一個與之對應(yīng)的成員變量,我們不能直接訪問屬性的后備存儲(backing store)。這種方式避免了混淆不同上下文環(huán)境下對值的訪問,并將屬性簡化為單一、明確的聲明。

代碼清單1

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)體實例的存儲屬性復(fù)制代碼

計算屬性

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

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

  • 如果計算屬性的setter沒有定義一個新值的變量名,則默認(rèn)為newValue
  • 如果只提供getter,而不提供setter,則該計算屬性為只讀屬性
  • 我們只能聲明變量型只讀屬性,因為它們的值不是固定的
  • 如果計算屬性是只讀的,則可以不使用get{}

計算屬性的實例如代碼清單2:

** 代碼清單2 **

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) { // 若不提供新值變量名,則默認(rèn)為newValueorigin.x = newCenter.x - size.width / 2origin.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 復(fù)制代碼

類型屬性

類型屬性是與類型相關(guān)聯(lián)的,而不是與類型的實例相關(guān)聯(lián)。對于某一類型的所有實例,類型屬性都只有一份拷貝。對于值類型,我們可以定義存儲類型屬性和計算類型屬性。對于類,我們只能定義計算類型屬性。和實例屬性不同的是,我們總是需要給存儲類型屬性一個默認(rèn)值。這是因為類型沒有初始化方法來初始化類型屬性。

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

** 代碼清單3 **

struct AudioChannel {static let threaholdLevel = 10static var maxInputLevelForAllChannels = 0var 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 = 7println(leftChannel.currentLevel) // 7 println(AudioChannel.maxInputLevelForAllChannels) // 7rightChannel.currentLevel = 11 println(rightChannel.currentLevel) // 10 println(AudioChannel.maxInputLevelForAllChannels) // 10 復(fù)制代碼

屬性觀察者

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

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

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

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

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

總結(jié)

以上是生活随笔為你收集整理的【转载】Swift属性Property的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。