• Swift3.0语法2


    (一)可选项:

     

    (二)懒加载:

    OC开发中,懒加载一般自定义控件。在Swift中,懒加载还是需要用的,可以保证控件延迟创建,还能避免处理控件解包。如果直接定义控件var label = UILabel,根据代码从上到下,会让控件在ViewDidLad之前就提前创建了。所以需要懒加载。OC中懒加载就是Get方法,Swift直接lazy var。当然也可以private lazy var来限定作用域。

    1)简单的懒加载:

      (2)完整的懒加载:()就是函数执行,就是一个特殊的闭包,所以懒加载本质是一个闭包。一般不这么写。

      

    3OCSwift区别

    *OC

        

        OC是等于nil时候就懒加载

        

      

      当labelnil的时候就在此调用。在ios6中,didReceiveMemoryWarning是不清理视图的。

     

     

      

    此时释放的时候就会报错。因为定义的时候没有?,就是一定有值得。

    那么如果定义时候加? 一旦label = nil,也不会在执行懒加载了!因为懒加载根本没写如果是空就创建。

    懒加载只会在第一次调用的时候执行闭包。Swift中一定注意不要主动清理视图或控件,因为懒加载不会创建了(例如内存警告别干掉控件,干掉了在也用不成了,因为懒加载就一次)

    (三)计算型属性(只读):

    1)getter/setter(开发不用):

     

     // 开发一般不用,还给搞一个_name。
            // swift一般不会重写getter和setter
            private var _name: String? // 假装的一个值
            var name: String? { get{return _name}  set{_name = newValue}} // get返回成员变量 set记录成员变量
        
            override func viewDidLoad() {
                super.viewDidLoad()
                
                demo()
            }

    2)计算型属性:readOnly只读:OC中重写get。Swift也是重写get,不管set就可以。

     

    // 只读,此时set赋值时候就会报错
            var name: String? { get{return "ABC"}}
            还有一种简写:
            var name: String? { return "ABC"}

     

    看这类属性,是本身不保存内容的,都是通过计算获得结果。就可以当我就是个没有参数只有返回值的函数!!我每次return值给你我的任务就完成了。每次你调用我这个属性的时候,我都会进行一次计算!都会执行我的代码然后return给你。我自身不存储的。

      (3)懒加载和计算型属性的区别:

    4)存储型属性:需要开辟空间,存储数据。一般的属性都是存储型属性(懒加载)

    5)存储和计算都可以?或者不加。看情况是不是必选

    (四)Swift中设置模型数据:

    Swift做好模型后。别的控件拿到模型后,由视图自己来显示。此时在didSet里写。就是替代OCSetter方法。(OCSetter要考虑_成员变量 = 值,而且如果是copy需要.copy,而Swift不需要考虑一切)

    (五)命名空间和反射机制

    1)命名空间:

    *在同一个空间(项目),全局共享。用第三方时,如果直接拖拽,那就从属于一个空间,很有可能冲突,所以用Cocopod

    *动态获得命名空间(从info.plist加载),命名空间和项目名称有关系。info的Bundle name其实就是命名空间(一般写的很奇怪 #ProdectNmae))。

    打印info

    print(Bundle.main.infoDictionary)

     

        赋值

            // 获取命名空间的值,可选
             let str = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
                    
             let con = NSClassFromString(str + "." + "ViewController") as? UIViewController.Type

    2)反射机制:对于任何类都可以知道类的所有属性和方法,对于任何对象都可以调用任何属性和方法,这种动态获取的信息和动态调用对象属性方法的功能成java的反射机制(Swift也有了)

    *OC中利用反射机制

    *Swift中利用反射机制类似。工作中用的很多很多。

    场景:AppDelegateOC中也用过,利用NSClassFromString获得类,然后设置根控制器。但是Swift中多了一个命名空间写法。)

     

            func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
                
                    
                    window = UIWindow(frame: UIScreen.main.bounds)
                    
                    // 依据String名字拿到控制器(添加项目名称,命名空间,不能有数字和特殊符号)
                    // 返回的是AnyClass? 需要as?强转
                    // 控制器添加Type类型
                    let rootControl = NSClassFromString("SwiftyDemo.ViewController") as? UIViewController.Type
                    
                    let vc = rootControl?.init()
                    
                    window?.rootViewController = vc
                    
                    window?.makeKeyAndVisible()
                     
                    return true
        }

     

    第三方框架,用了很多反射机制和工厂方法,为了实现大量的解耦和封装,很麻烦。一个方法可能跳10个方法10个控制器才写了一个加法。但是如果涉及高级开发和封装,必须要经过这一步。

     

  • 相关阅读:
    iOS使用自签名证书实现HTTPS请求
    DB操作-用批处理执行Sql语句
    SSL通信-忽略证书认证错误
    oracle 19c awr 丢失 i/o信息
    this.$route.query刷新后类型改变
    wx.navigateTo在app.js中偶发性失效
    微信小程序new Date()转换日期格式时iphonex为NaN
    下载cnpm成功,cnpm -v却不识别
    element-ui的表单验证如何清除校验提示语
    5. 最长回文子串(动态规划算法)
  • 原文地址:https://www.cnblogs.com/sgxx/p/6096918.html
Copyright © 2020-2023  润新知