zoukankan      html  css  js  c++  java
  • Swift学习笔记十:属性与懒加载 Property & Lazy

    属性 Property

    • getter  &  setter 方法
     // getter & setter 仅供演示, 日常开发不用
       
        private var _name: String?
       
        // Swift 中, 一般不会重写 getter 方法和 setter 方法
        var name: String? {
           
            get
            {
                // 返回成员变量
                return _name
            }
           
            set
            {
                // 使用 成员变量 记录值
                _name = newValue
            }
        }
    • 计算型属性(只读属性)
      // OC 中定义属性的时候, 有一个 readonly ---> 重写 getter 方法
        var title: String {
           
            // 只重写了 getter 方法, 没有重写 setter 方法
            get
            {
                return "Mr. " + (name ?? "")
            }
        }
       
        // 只读属性的简写, 又称之为计算行属性: 本身不保存内容, 都是通过计算获得结果
        // 类似于一个函数: 没有参数, 一定有返回值
        var title2: String {
           
            return "Mr. " + (name ?? "")
        }
     
    • didSet 方法
    class DemoLabel: UILabel {
    
        // 模型 ---> 给视图设置模型, 由视图自己根据模型的数据显示内容
        var person: Student? {
           
            // 就是替代 OC 中重写 setter 方法
            // 区别: 再也不需要考虑  _成员变量 = 值
            // OC 中如果是 copy 属性, 应该 _成员变量 = [值 copy]
            didSet
            {
                // 此时 name 属性已经有值, 可以直接使用设置 UI 内容
                text = person?.name
            }
        }
    }
     
     
    懒加载 Lazy
    • 延迟加载, 减少内存的消耗
    • 可以解除解包的烦恼
    class ViewController: UIViewController {
       
       
        var label: DemoLabel?
       
        // 初始化并且分配空间 label, 会提前创建
        // 在移动端开发, 延迟加载 减少内存消耗
        // 懒加载 - lazy
        /*
            1. 能够延迟创建
            2. 最大的好处, 可以解除解包的烦恼
         */
       
        // lazy var label2: DemoLabel = DemoLabel()
       
        // 懒加载本质上是一个 闭包
        // 懒加载会在第一次访问的时候执行, 闭包执行结束后, 会把结果保存在 属性 中
        // 后续调用, 直接返回 属性 的内容
        // 懒加载的属性会分配空间, 存储值
        // 只要调用过一次, 懒加载后面的闭包再也不会执行了
       
        // 完整写法
        /*
            {} 包装代码
            () 执行代码
        
            日常开发:
            1. 闭包中的智能提示不好
            2. 闭包中如果出现 self. 还需要注意循环引用
         */
        lazy var label2 = { () -> DemoLabel in
           
            let l = DemoLabel()
           
            // 设置 Label 的属性...
           
            return l
        }()
       
        // 注意: 一旦 label 被设置为 nil, 懒加载也不会再次执行
        // 懒加载的代码只会在第一次调用的时候, 执行闭包, 然后将闭包的结果保存在 label 的属性中
        private lazy var label3: UILabel? = UILabel()
       
    
        override func viewDidLoad() {
            super.viewDidLoad()
           
    
            // 设置 UI
            setupUI()
           
           
            label3?.text = "hello"
            label3?.sizeToFit()
           
            print(label3 as Any)
           
            label3 = nil
           
            print(label3 as Any)
        }
       
        private func setupUI()
        {
            // 1. swvf控件
            label = DemoLabel()
           
            // 添加到视图
            // ! 解包, 为了参与计算, addSubView 用 subViews 数组记录控件, 数组中不允许加入 nil
            // ? 可选解包, 调用方法, 如果为 nil, 不调用方法, 但是不能参与计算
            view.addSubview(label!)
           
            label?.text = "hello"
            label?.sizeToFit()
            label?.center = view.center
        }
       
        override func didReceiveMemoryWarning()
        {
            // Swift 中一定注意不要主动清理视图或者控件
            // 因为懒加载不会再次创建
        }
    }
  • 相关阅读:
    Tomcat 性能监控与调优
    04 使用 BTrace 进行拦截调试
    03 JVisualVM(本地和远程可视化监控)
    02 jmap+MAT(内存溢出)、jstack(线程、死循环、死锁)
    01 JVM的参数类型、jinfo & jps(参数和进程查看)、jstat(类加载、垃圾收集、JIT 编译)
    69_缓存预热解决方案:基于storm实时热点统计的分布式并行缓存预热
    66_讲给Java工程师的史上最通俗易懂Storm教程:纯手工集群部署
    57_分布式缓存重建并发冲突问题以及zookeeper分布式锁解决方案
    54_基于nginx+lua+java完成多级缓存架构的核心业务逻辑
    53_部署分发层nginx以及基于lua完成基于商品id的定向流量分发策略
  • 原文地址:https://www.cnblogs.com/fanxiaocong/p/6413311.html
Copyright © 2011-2022 走看看