Swift -- 闭包

一:闭包的表达式

//闭包就是函数,是一种有特定格式的函数。常用于保存一段代码,用作回调,处理耗时操作等等
//闭包格式如下
//{ (参数) -> 返回值类型 in 执行的语句 }
//in是用来区分形参,返回值和执行代码

//调用函数
myname("sgc") { () -> () in
            print("执行回调")
        }
//也可以这样调用
myname("sgc",{ () -> () in
            print("执行回调")
        })
//闭包作为参数
func myname(name: String, finished: () -> ()){
        print(" my name = \(name)")//执行耗时操作
        finished()
    }
    /*闭包简写:
        1.如果没有参数, 没有返回值, in和in之前的东西可以省略
        2.如果闭包是函数的最后一个参数, 可以写在()后面  -- 尾随闭包
        3.如果只有一个闭包参数, 那么()也可以省略  -- 尾随闭包
        4.闭包写在参数列表中
        */

二:闭包返回值

 
   //调用createScrollView函数
   let sc = createScrollView({ () -> Int in
            return 15
            }) { (index) -> UILabel in
                let width = 50
                let label = UILabel()
                label.backgroundColor = UIColor.greenColor()
                label.textColor = UIColor.darkGrayColor()
                label.font = UIFont.systemFontOfSize(17)
                label.text = "text\(index)"
                label.frame = CGRect(x: index * width, y: 0, width: width, height: 44)
                return label
        }
        view.addSubview(sc)
        
    }
    
    
    
    
    
    //创建两个闭包参数,用来返回ScrollView的数量,和ScrollView上子view的类型
    func createScrollView(labelCount: ()->Int, viewWithIndex: (index:Int)->UILabel) -> UIScrollView{
        // 1.创建UIScrollView
        let sc = UIScrollView(frame: CGRect(x: 0, y: 100, width: 375, height: 44))
        
        let count = labelCount()//闭包返回的子view个数
        
        // 2.遍历创建UILabel
        for i in 0..<count{
            let label = viewWithIndex(index: i)//闭包返回的子view
            sc.addSubview(label)
            sc.contentSize = CGSize(width: CGFloat(count) * label.bounds.width, height: 44)
        }
        
        // 返回UIScrollView
        return sc
    }

三:循环引用的问题

   参照这篇文章: http://www.cocoachina.com/ios/20160224/15349.html



你可能感兴趣的:(返回值,闭包,swift)