swift 属性的几个写法

来源:互联网 发布:舞台音乐控制软件 编辑:程序博客网 时间:2024/05/17 16:14

import Foundation

class Person : NSObject

{

    //普通属性

    var firstName = ""

    var lastName  = ""

    var nickName  = ""

    

    //计算属性,不需要等号,不需要初始值,swift要求存储属性在对象构造完毕后必须有初始值,计算属性好像没有要求

    var fullName:String{

        set{

            //如果没有set,就是只读属性

            print(newValue)

        }

        get{

            return nickName + " " + firstName + " " + lastName

        }

    }

    

    //带属性监视器的普通属性,直接大括号,然后  didSet  就相当于oc的重写set方法

    var age = 0{

        //我们需要在age属性变化前做点什么

        willSet{

            print("Will set an new value \(newValue) to age ")

        }

        

//        我们需要在age属性发生变化后,更新一下nickName这个属性

//        didset里可以做以前oc在重写set时做的事

        didSet{

            print("age filed changed form \(oldValue) to -> \(age)")

            if age<10{

                nickName = "Little"

            }else{

                nickName = "Big"

            }

        }

    }

    比如经常重写的setModel

- (void)setModel{

_model = model

self.left.text = model.left

            self.button .setTitle(model.button, forState: .Normal)

            self.right.text = model.right

  var model : MyModel!{

        didSet{

            self.left.text = model.left

            self.button .setTitle(model.button, forState: .Normal)

            self.right.text = model.right

        }

    }

//    懒加载后面的类型 :[Int 不可以省略, 在{}后有个()

    lazy var dataArray : [Int] = {

        var array = [Int]()

        for  i in 0 ..< 100{

            array.append(i)

        }

        print(self)

        return array

    }()

    

    let block = {

        

        print("我是一个闭包,")

    }

    

    lazy var lazyBlock = {

        print("我是一个懒加载的闭包")

    }

    

    override var description: String {

        return "Full Name: \(fullName) " + ", Age: \(age)"

    }

    

    deinit{

        print("person  死了")

    }

    

}

var me : Person! = Person()

me.firstName = "Zhang"

me.lastName  = "San"

me.age = 20

me.block()

me.lazyBlock()

me.lazyBlock = { print("我是新产生的懒加载闭包,因为懒加载必须是var类型") }

me.lazyBlock()

print(me)

me = nil

/*程序输出

 

 Will set an new value 20 to age

 

 age filed changed form 0 to -> 20

 

 我是一个闭包,

 

 我是一个懒加载的闭包

 

 我是新产生的懒加载闭包,因为懒加载必须是var类型

 

 Full Name: Big Zhang San , Age: 20

 

 person  死了

 

 */

总结: 
1. 计算属性不需要=,因为不需要初始化,其他属性都需要=
2. 普通属性和带观察器的属性不需要类型,这两个可以根据类型推断得出,计算属性,lazy属性需要类型,在初始化结束时,这两个都是没有值的,所以需要带类型
3. lazy属性需要(),可能是为了和闭包有个区分吧,lazy属性 必须是var

在加一个单例的写法

//声明一个单例

class SingleClass: NSObject {

    static let defaultManager = SingleClass.init()

    var money = 13.5

}

let  manager1 = SingleClass.defaultManager

        print(manager1.money)

        

        let manager2 = SingleClass.defaultManager

        manager2.money = 3523

        print(manager1.money)

/*

13.5

3523.0

*/


0 0
原创粉丝点击