读书笔记-Swift-02函数

2017-08-26  本文已影响0人  秋水天的练功房

函数参数和返回值

fun sum (_ x: Int, _ y:Int) -> Int {
    let result = x + y
    return result
}

Void返回类型和参数

函数签名

() -> () //空参数列表,返回值也为空

外部参数名


重载


默认参数值


可变参数

func sayStrings(_ arrayOfStrings:String ...){
    for s in arrayOfStrings{ print(s) }
}
sayStrings("haha","hoho","huhu")

被忽略的参数

可修改的参数

函数内部的函数

递归

函数作为值

匿名函数

UIView.animate(withDuration:0.4,
    animations :{
        ()->() in
        self.myButton.frame.origin.y += 20
    },
    completion:{
         (finished:Bool) -> () in
          print("finished: \(finished)")
    }
)
    func doThis(_ f:() ->()){
        f()
    }

    // 忽略括号,这里是函数调用,不是函数定义
    doThis{
        print("Howdy")
    }

let arr = [2,4,6,8]
func doubleMe(i: Int) -> Int{
    return i * 2
}
// 原始的写法
let arr2 = arr.map(doubleMe)

// 更加swift的写法
let arr2 = arr.map({
    (i: Int) -> Int in 
    return i * 2
})

// 非常swift的写法
let arr2 = arr.map{$0 * 2}

定义和调用


闭包

闭包怎样改进代码

    // 原本函数是这样的
     func imageOfSize(_ size:CGSize, _ whatToDraw:()->()) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size,false,0)
        whatToDraw()
        let result = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return result
    }

    // 我们可以这样调用
    let sz = SGSize(width:45,height:20)
    let image = imageOfSize(sz) {
        let p = UIBesierPath(roundeedRect:sz,cornerRadius:8)
      p.stroke()
    }
    //然后包起来
func makeRoundedRectangle(_ sz:SGSize) -> UIImage {
    let image = imageOfSize(sz){
        let p = UIBesierPath(
            roundedRect:CGRect(origin:CGPoint.zero,size:sz)
            cornerRadius:8
        )
        p.stroke()
    }
}

函数返回函数

func makeRoundedRectanglemaker(_ sz:CGRect) -> () -> UIImage {
  return {
      imageOfSize(sz) {
        let p = UIBezierPath(
            roundedRect:CGRect(origin:CGPoint.zero, size:sz)
            cornerRadius:8
        )
        p.stroke()
      }
  }
}

闭包设置一个捕获变量

闭包保护捕获环境

Escaping 闭包


柯里化函数

可以返回带参数的函数,外部调用的时候,参数一个个传下去。

func makeRoundedRectangleMaker(_ sz:CGSize) -> (CGFloat) -> UIImage {
   return {
      r in
      imageOfSize(sz){
        let p = UIBezierPath(
          roundedRect:CGRect(origin:CGPoint.zero, size:sz),
          cornerRadius:r)
        p.stroke()
      }
  }

}

函数引用和Selectors

函数引用范围

Selectors

上一篇 下一篇

猜你喜欢

热点阅读