33

Swift开发入门-进阶知识(一),附demo

 5 years ago
source link: http://www.cocoachina.com/ios/20190313/26545.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Swift是一门新的语言,不过现在已经出到Swift4了,很多人想学Swift,不知从何开始,今天我就简单说下入门知识,我认为在学习Swift之间最好先把这些基本的知识掌握了,才能更好的去认识它学习它,使用它.

全是干货,并且附上demo: Swift开发进阶知识(01)demo .

阅读顺序:

Swift开发入门-基础知识 .

Swift开发入门-进阶知识(一) .

Swift开发入门-进阶知识(二) .

开始 --- Swift --- Coding

一、Swift进阶知识须知

  • 我在上一篇文章中简单介绍了一下基础知识,认真看完基础知识后,大多数人应该可以试着开发一个小demo.

  • 但是想写一个功能性的demo,还是不行的,还是有很多东西我们需要了解.

  • 在看这篇文章(demo)前,我建议把入门的基础知识先了解一下.参考链接: https://www.jianshu.com/p/3b01707fed18

二、闭包的基本格式

闭包是swift中常用的一个知识点

闭包和OC中的block类似

  1. 闭包是提前定义的一段可以执行的代码块

  2. 可以当做参数 在函数中传递

  3. 在需要的时候执行代码块引用,完成回调的作用

  4. 在block中如果访问到了self或者其属性的时候,要注意考虑循环引用

我通过几个例子来展示闭包的使用方法

1.没有参数没有返回值的闭包

  //使用闭包来实现demo1A
    //() -> ()没有参数没有返回值的闭包
    func demo1B() {
        let closure: () -> () = { () -> () in            print("我是一个没有参数没有返回值的闭包")
        }        //执行闭包
        closure()
    }
    
    func demo1A() {        func sum(){
            print("我是一个没有参数没有返回值的方法")
        }
        sum()   //调用方法
    }

2.有参数没有返回值的闭包

  • 闭包是一个封闭的结构:闭包的参数,返回值 和闭包需要执行的代码片段都应该在闭包的内部

  • in 是一个分割的标记

    //使用闭包来实现demo2A
    func demo2B() {        let closure = { (a: Int,b: Int) -> () in
            let res = a + b
            print(res)
        }        //执行闭包
        closure(2, 3)
    }
    
    func demo2A() {
        func sum(a: Int,b: Int){            let res = a + b
            print(res)
        }
        sum(a: 2, b: 3)  //执行
    }

3.有参数有返回值的闭包

    func demo3B() {        let closure = { (a: Int,b: Int) -> Int in
            let res = a + b            return res
        }        //执行闭包
        //回调结果应该放在参数部分还是返回值部分??
        //放在参数部分来进行回调
        let res = closure(3, 3)
        print(res)
    }

三、闭包的调用

  • 闭包可作为函数的参数来调用,执行回调

    先写两个带闭包参数的方法,一个只有闭包参数,第二个还带有一个非闭包的参数

    //模拟网络请求
    func loadData(finishedCallBack: @escaping (String) -> ()) {        //1.在全局队列中做耗时操作
        DispatchQueue.global().async {            //在全局队列中休眠
            Thread.sleep(forTimeInterval: 1)            //2.在主队列中回调数据
            DispatchQueue.main.async {                //执行闭包
                finishedCallBack("哈哈哈哈哈哈哈哈哈")
            }
        }
    }
    
    func loadData(userName: String,finishedCallBack: @escaping (String) -> ()) {        //1.在全局队列中做耗时操作
        DispatchQueue.global().async {            //在全局队列中休眠
            Thread.sleep(forTimeInterval: 1)            //2.在主队列中回调数据
            DispatchQueue.main.async {                //执行闭包
                finishedCallBack("嘎嘎嘎嘎嘎嘎嘎")
            }
        }
    }

闭包调用

//第一个函数
 loadData { (result) in
            print(result)
        }

//第二个函数
 loadData(userName: "小明") { (result) in
            print(result)
        }
  • 当最后一个参数是闭包的时候,可以形成尾随闭包

    尾随闭包注意点:

    1.系统会帮你简写,不需要coder手动简写

    2.简写的规律:当函数最后一个参数是闭包的时候,函数的参数的 '()' 会提前关闭

    3.如果函数只有闭包一个参数 '()'可以省略

四、 闭包的循环调用

闭包和OC的Block类似,都有可能造成循环引用

  • 第一种方式: weak self 当self被系统回收时,self的地址会自动指向nil

    ->和OC中的 __weak 类似

  • 第二种方法: [unowned self]当self被系统回收时,self的地址不会自动指向nil ,有可能导致坏地址,野指针

    -> 和OC中的 __unsafe_unretained 关键字的作用类似

可选解包有什么作用呢?

->调用方法或者属性的时候 使用可选解包,如果调用的对象为nil 就不会继续执行

解决方法:

    //1.模仿OC的解决方式
    func swiftMethodInOC() {        weak var weakSelf = self
        loadData { (result) in
            print(weakSelf?.view ?? "2")
        }
    }    //2.unowned
    func swiftClosureMethod() {
        loadData { [unowned self] (result) in
            
            print(self.view)
        }
    }

五、Swift命名空间

我们在swift中调用其他类,不需要导入头文件

  • 这是因为swift支持命名空间

  • 在同一个命名空间中(以项目为一个维度),默认所有的文件共享, 不需要导入头文件

六、Swift面向对象的必选属性

新建一个Person类,并添加一个必选属性: var name: String
新建一个Student类,继承于Person类,并添加一个必选属性: var number: String

Person类内容:

class Person: NSObject {
    
    var name: String    
    //override 重写 面向对象的重要特征,父类已经存在的方法或者属性,子类需要做特殊的操作 可以重写
    //重写的特点:在方法的内部可以super
    //构造方法必须对 必选属性 负责,对象构造成功之后,必选属性必须有值
    //对象的初始化分段进行,先初始化子类(给必选属性赋值),再初始化父类
    //super.init  是对象构造结束的标记
    override init() {        //在隐式生成super.init 之前没有给self.name设置初始值,会报错
        name = "小明"
        super.init()        
        /*
         下面这个写法会报错,先写
         super.init()
         name = "1"
         */
        
        memeda()
    }    
    //添加一个对象方法
    
    func memeda() {
        print("么么哒")
    }
}

student类:

class Student: Person {

    var number: String
    
    override init() {
        number = "001"
        super.init()
    }
    
}

调用:

  func fiveDemo() {        let p = Person()        print(p.name)        
        let s = Student()        print(s.number,s.name)
    }

所有的关于必选属性的说明,都在代码的注释里面,不赘述.

总结

相较于上一篇文章 Swift开发入门-基础知识(一) ,这稍微有点难度,但是在开中,这些都是基本技能,是入门知识.

学习swift还有一个很好的教材,那就文档,很多不喜欢看文档最主要的原因是因为,看不懂英文.还好swift有中文版的文档: swift4中文文档

配合学习,加油 加油!!!

最后,附上这篇文上所有代码的demo: Swift开发进阶知识(01)demo .


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK