懒加载 、set方法和get方法

2018-01-10  本文已影响0人  叶子扬

Swift中的懒加载会在第一个访问的时候执行
懒加载其实就是一个提前准备好的的闭包
注意:懒加载一定要用var

class ViewController: UIViewController {

    // 开发常用格式
    lazy var dataList: [String] = {
        print("我懒加载了")
        return ["猪哥哥", "曾阿牛", "朱丽叶"]
    }()
    
    let demoFunc = {
        () -> [String]
        in
        print("我懒加载了")
         return ["猪哥哥", "曾阿牛", "朱丽叶"]
    }
    lazy var dataList2: [String] = self.demoFunc()
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print(dataList)
        print(dataList)
        
        print(demoFunc())
        
        print(dataList2)
        print(dataList2)
    }
}

set方法和get方法


class Person: NSObject {
    // 一般开发不建议酱紫写法
    var _name:String?
    var name: String?{
        get{
            return _name
        }
        set{
            // 主要外界通过对象.name给name赋值,这个值就会保存于 newValue里面
            _name = newValue
        }
    }
    
    // 一般是酱紫写法
    var gender:String?{
        // 用didSet代替set,在设置完值以后调用
        didSet{
            print(gender)
        }
    }
    
    // 如果仅仅重写get方法,这个属性成为 计算型 属性
    // 对应OC中的只读属性
    // 注意点:计算型属性是不占用内存空间的
    var age:Int{
        get{
            return 24
        }
    }
}

外边的调用

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let p = Person()
        p.name = "zgg"
        print(p.name!) 
        
        p.gender = "man"
        print(p.gender!)
        
      // 这句报错:原因是只读属性
      // Cannot assign to property: 'age' is a get-only property
        p.age = 100

        print(p.age) // 24
    }
}

willSet 和 didSet

以下是周银辉的开发博客中对Swift中的willSet与didSet的表述,直观不啰嗦,直接上代码
租用:在Swift语言中用了willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化

import Foundation

class People : NSObject
{
    //普通属性
    var firstName:String = ""
    var lastName:String  = ""
    var nickName:String  = ""
    
    //计算属性
    var fullName:String
    {
        get
        {
            return nickName + " " + firstName + " " + lastName
        }
    }
    
    //带属性监视器的普通属性
    var age:Int = 0
    {
        //我们需要在age属性变化前做点什么
        willSet
        {
            println("Will set an new value \(newValue) to age")
        }
        //我们需要在age属性发生变化后,更新一下nickName这个属性
        didSet
        {
            println("age filed changed form \(oldValue) to \(age)")
            if age<10
            {
                nickName = "Little"
            }else
            {
                nickName = "Big"
            }
        }
    }
    
    func toString() -> String
    {
        return "Full Name: \(fullName) " + ", Age: \(age) "
    }
}

var me = People()
me.firstName = "Zhang"
me.lastName  = "San"
me.age = 20

println(me.toString())

/*程序输出
Will set an new value 20 to age
age filed changed form 0 to 20
Full Name: Big Zhang San , Age: 20
*/
上一篇 下一篇

猜你喜欢

热点阅读