美文网首页
Swift之属性

Swift之属性

作者: 张义飞 | 来源:发表于2017-03-29 13:06 被阅读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" //会出错
    
    • 由于结构体是一个值类型,当改值类型被标记为常量时(let),其所有属性也被标记为常量。对类是不同的,他们是引用类型,入伏哦将引用类型的实例分配给常量,则人仍可以改变实例的变量属性。

    懒加载

    • 一个lazy的存储属性,它的初始化值第一次调用时不会被计算。您lazy在声明之前编写修饰符,表示一个懒惰的存储属性。

    懒惰属性必须是变量(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")
    
    • 这个时候tags并不会被创建,只有第一次调用才会会创建。

    计算属性

    • 错误写法
    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
        }
    }
    
    • 另外一种设置方法就是使用let,但是这种方法不太灵活

    静态属性 Static

    • 使用static声明的属性,使用改类调用,该属性存储在静态区。

    • 我们可以使用这个Static创建一个单例

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

    补充

    • 初始化Swift常量

    • 假如现在我们想声明一个label, 我们一般会这样做。

    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
    

    相关文章

      网友评论

          本文标题:Swift之属性

          本文链接:https://www.haomeiwen.com/subject/jtveottx.html