swift小知识点之{…}()匿名函数调用

Swift中支持匿名函数的调用,我们可以使用匿名函数对数据进行初始化操作,如下所示,是一个匿名函数的创建调用操作:

{
//匿名函数代码
}()

花括号定义匿名函数的函数体,小括号表示调用该匿名函数,这与JS十分相似。

我们可以使用匿名函数对一个属性进行一些复杂的初始化操作,例如下面的代码操作:

    //MARK:Initail Methods
    func initWithContentView(){
        ///导航栏
        navigatBar = {
            let X:CGFloat = 0.0
            let Y:CGFloat = p_isIphonX() ? 44 : 20
            let W:CGFloat = UIScreen.main.bounds.width
            let H:CGFloat = 44.0
            
            let view = UIView()
            view.frame = CGRect(x: X, y: Y, width: W, height: H);
            view.backgroundColor = .white
            return view
        }()
        ///表视图
        listView = {
            let X:CGFloat = 0.0
            let Y:CGFloat = navigatBar!.frame.maxY
            let W:CGFloat = UIScreen.main.bounds.width
            let H:CGFloat = (UIScreen.main.bounds.height - Y)
            
            let view:UITableView = UITableView.init(frame: CGRect(x: X, y: Y, width: W, height: H), style: .plain)
            view.delegate = self
            view.dataSource = self
            view.separatorStyle = .none
            view.register(UITableViewCell.classForCoder(), forCellReuseIdentifier: NSStringFromClass(UITableViewCell.classForCoder()))
            return view
        }()
    }

对于属性navigatBar,listView 我们可能需要进行一些列的初始化工作,我们可以在声明该属性的时候同时使用匿名函数进行初始化操作即可。

让我来示范一下如何用闭包来创建一个对象。我们设计一个名为Human的结构:

struct Human {
    init(){
        print("Born 1996")
    }
}

现在,让你看看怎么用闭包创建对象:

let createBob = {
    () -> Human in
    let human = Human()
    return human
}
let babyBob = createBob()

解释一下,createBob 是一个类型为 ()-> Human 的闭包。你已经通过调用 createBob() 创建好了一个 babyBob 实例。

然而,这样做你创建了两个常量:createBobbabyBob。如何把所有的东西都放在一个声明中呢?请看:

let bobby = { () -> Human in
 let human = Human()
 return human
}()

现在,这个闭包通过在最后加上 () 执行了自己,bobby 现在被赋值为一个 Human 对象。

posted on 2020-09-10 16:52  梁飞宇  阅读(2366)  评论(0)    收藏  举报