Swift3.0语法2

(一)可选项:java

 

(二)懒加载:ios

OC开发中,懒加载通常自定义控件。在Swift中,懒加载仍是须要用的,能够保证控件延迟建立,还能避免处理控件解包。若是直接定义控件var label = UILabel,根据代码从上到下,会让控件在ViewDidLad以前就提早建立了。因此须要懒加载。OC中懒加载就是Get方法,Swift直接lazy var。固然也能够private lazy var来限定做用域。swift

1)简单的懒加载:闭包

  (2)完整的懒加载:()就是函数执行,就是一个特殊的闭包,因此懒加载本质是一个闭包。通常不这么写。app

  

3OCSwift区别框架

*OCide

    

    OC是等于nil时候就懒加载函数

    

  

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

 

 

  

此时释放的时候就会报错。由于定义的时候没有?,就是必定有值得。3d

那么若是定义时候加? 一旦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个控制器才写了一个加法。可是若是涉及高级开发和封装,必需要通过这一步。

相关文章
相关标签/搜索