Swift之属性

2017-03-29  本文已影响0人  张义飞

属性

存储属性: 将常量和变量存储为实例的一部分。有类,结构体提供。

计算属性: 计算值,由类,结构体,枚举提供。

属性观察:定义属性观察器来监视属性的修改,从而进行自定义的操作进行响应。

存储属性

struct Person {
    //以下为变量(var)和常量(let)的存储属性
    var name: String
    let sex: String
    let age: Int
}

var people = Person(name: "Bill", sex: "男", age: 20) //这个people我们使用var声明的变量,所以他可以修改他的名字
people.name = "Jack"
people.age = 21 //将会出错,因为它是常量(let)初始化之后就不能在被改变了
let people = Person(name: "Bill", sex: "男", age: 20)
people.name = "jason" //会出错

懒加载

懒惰属性必须是变量(var),因为实例初始化完成后,无法知道它的初始值,当时常量必须在对象初始化时必须有一个初始值。因此常量属性不能被声明为lazy的。

class Person: NSObject {
    var name: String
    lazy var tags = ["ios","Web", "Java", "Pyth"] //加入这是一个有很多数量的数组
    
    init(name: String) {
        self.name = name
    }
}

let people = Person(name: "Bill")

计算属性

class Person: NSObject {
    
    var name: String {
        get {
            return self.name //这样会造成递归调用,最终造成程序崩溃
        }
        set(newName) {
            newName.appending("Bill")
        }
    }
}
class Person: NSObject {
    private var _name: String!
    var name: String {
        get {
            return self._name //这样会造成递归调用,最终造成程序崩溃
        }
        set(newName) {
            self._name = newName.appending("Bill")
        }
    }
}

属性监测

class Person: NSObject {
    var name: String = "" {
        didSet {
            print("已经起好名字了")
        }
    }
}

只读属性

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double { //只读
        return width * height * depth
    }
}

静态属性 Static

class Person: NSObject {
     static let sharedInstance = Person()
    
    private override init() {
        //防止外界使用init实例化
    }
}

补充

func createLabel() -> UILabel {
    let label = UILabel()
    label.text = "Bill"
    return label
}
let label: UILabel = {
    let label = UILabel()
    label.text = "Bill"
    return label
}()
let label: UILabel = {
    $0.text = "Bill"
    $0.font = UIFont.systemFont(ofSize: 15)
    return $0
}(UILabel())

print(label.text!) // Bill
上一篇下一篇

猜你喜欢

热点阅读