美文网首页
swift之函数和闭包

swift之函数和闭包

作者: 王小妞闯天涯 | 来源:发表于2018-05-02 19:27 被阅读4次

    一、swift函数

    1.一个特别简单的函数实现连个数的相加

    func sum (int :  x, int  : y)-> Int{

       return x+y

    }

    *sum 是函数名

    *sum后的括号中是形参列表,格式为 变量名 : 类型,多个变量名之前使用“,”隔开

    *箭头后是返回值类型

    2.关于函数外部参数

    sum1(num1 x:Int,num2 y:Int) -> Int {

        return x+y;

      }

    *外部参数,就是在形参前加一个参数,不影响形参使用,外部调用会显示出来

    *外部参数如果是“_”,会省略形参的名字

    *在swift中“_”表示可以忽略任何不感兴趣的内容 形参,不关心的变量

    同下:

    funcsum2(_x:Int,_y:Int) ->Int{

            returnx+y;

        }

    3.设置函数默认值

    funcsum3(x:Int=1, y:Int=2) ->Int{

            returnx + y

        }

    通过给参数设置默认值,可以任意组合参数,如果不指定,就使用默认值,OC中没有这个功能

    4.无返回值的三种写法

    func demo1() {

        print("无返回值demo1") //直接省略返回值

    }

    func demo2() -> () {

      print("无返回值demo2") //空括号的返回值

    }

    func demo3() -> Void {

        print("无返回值demo3") //void的返回值

    }

    这三种方式是一样的,在swift中”->“表示前面是执行后面是返回目标

    二、swift闭包

    闭包类似于OC中的block,同block一样,常用于回调

    1.异步回调

    2.控制器回调

    3.自定义视图回调

    *定义无参数无返回值的闭包

    let bag1 = {

      print("hellow")

    }

    *执行闭包

    bag1()

     *有参数无返回值的闭包

      let bag2 = { (x : Int)->() in

            print(x)

        }

        bag2(10)

    *有参数有返回值的闭包

        let b3 = { (x:Int)-> Int in

          return x * x

        }

        print(b3(5))

       *无参有返

        let b4 = { ()->String in   

            return "你好"

        }

        let result = b4()

        print(result)

    关于闭包:

    关键字 in 分割定义和实现

    格式:

    变量名  = { (参数列表以“,”分割)->返回值类型 in

    此处是实现

    }

    *关于尾随闭包

    尾随闭包:如果函数的最后一个参数是闭包,函数的参数可以提前结束,最后一个参数直接使用{}包装的代码

    我们写一个最后一个参数是闭包的函数:

    func loadData(complitation : @escaping (_ result: [String])->()) { DispatchQueue.global().async { 

    Thread.sleep(forTimeInterval: 1) 

    let json = ["","八卦","出大事"]

    DispatchQueue.main.async { }

     complitation(json)

    } }

    我们来调用的时候:可以直接结束

     loadData{ (result) in

               print(result)

            }

    关于花括号,与OC不一样的是,OC表示执行一段代码,而swift表示尾随闭包,不能像OC那样写,但是我们可以加do,表示执行

    注:关于闭包的循环引用

    这里大概说一下,swift中我们有三种方式解决循环引用

    OC方式:

     weak var weakself =self

            loadDemo{

                print(weakself?.view??"释放")

       }

    swift方式:

     loadDemo2{ [weak self] in

                print(self?.view)//[weak self]表示{}中所有的self都是弱引用,需要注意要解包

            }

     loadDemo2{ [unowned self]in

                print(self.view)//[unowned self] 表示闭包内所有的self都是assign,不会是强引用,但是如果对象释放,指针地址不会变化,有可能会蹦,会出现野指针的问题

            }

    相关文章

      网友评论

          本文标题:swift之函数和闭包

          本文链接:https://www.haomeiwen.com/subject/xkwcrftx.html