Swift-屬性 (Properties)

  • 存儲屬性
  • 計算屬性
  • 屬性觀察器
  • 類型屬性
  • 存儲屬性

存儲常量或變量作為實例的一部分,用于結(jié)構(gòu)體

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

栗子

等下!?? 先談?wù)凷wift中的 問號"?" , "!"感嘆號
問號?

a.聲明時添加?,告訴編譯器這個是Optional的,如果聲明時沒有手動初始化,就自動初始化為nil
b.在對變量值操作前添加?,判斷如果變量時nil,則不響應(yīng)后面的方法。

嘆號!

a.聲明時添加!,告訴編譯器這個是Optional的,并且之后對該變量操作的時候,都隱式的在操作前添加!
b.在對變量操作前添加!,表示默認為非nil,直接解包進行處理

所以

可以理解為: '!'修飾的變量不可為nil, '?'修飾的變量可為nil. 所以在訪問'!'修飾的變量一旦不小心為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() // 初始值為一個UIView對象
    lazy var label: UILabel = {
        let tempLabel = UILabel()
        // Config
        return tempLabel
    }() //  lazy 創(chuàng)建一個label
   // MARK: func
    override func viewDidLoad() {
        super.viewDidLoad()
        print("name1=",name1)
        print("name2=",name2)
        print("namevar1=",namevar1) // 若訪問為空的屬性,會報警告提示 "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>>
         */
    }
注意:

必須將延遲存儲屬性聲明成變量(使用 var 關(guān)鍵字),因為屬性的初始值可能在實例構(gòu)造完成之后才會得到。而常量屬性在構(gòu)造過程完成之前必須要有初始值,因此無法聲明成延遲屬性。

  • 計算屬性

    類似OC重寫Setter Getter 。
    **類 ** 結(jié)構(gòu)體 枚舉 可定義計算屬性。
    通常通過計算屬性間接獲取或設(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)”

只讀計算屬性: ( 只有 getter 沒有 setter聲明可以去掉 getter 關(guān)鍵字和花括號)

    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
    }
注意:

計算屬性只能使用關(guān)鍵字 var 定義,為毛?因為它是變的。

  • 屬性觀察器

    檢測屬性的變化
    每次屬性被賦值的時候調(diào)用
    延遲屬性(lazy), 計算屬性不可直接使用
栗子
/*
// 不賦初始值
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)用(觀察器會將新的屬性值作為常量參數(shù)傳入”默認名稱`newValue`)
 `didSet` 在新的值被設(shè)置之后立即調(diào)用(觀察器會將舊的屬性值作為參數(shù)傳入,可以為該參數(shù)命名或者使用默認參數(shù)名 `oldValue`。如果在 didSet 方法中再次對該屬性賦值,那么新值會覆蓋舊的值。)

任意選哪個都可,也可全選,視編碼時具體情況而定

  • 類型屬性

跟實例的存儲型屬性不同,必須給存儲型類型屬性指定默認值
使用關(guān)鍵字 static 來定義,通過類型本身來訪問
它們只有在第一次被訪問的時候才會被初始化。即使它們被多個線程同時訪問,系統(tǒng)也保證只會對其進行一次初始化,并且不需要對其使用 lazy 修飾符。

栗子

下面栗子演示了“存儲型和計算型類型屬性的語法:

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

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

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

總結(jié):

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

參考: SwiftSwift指南

你堅持過很認真的做一件事兒嗎?為何不試試......
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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