源码

首页 » 归档 » 源码 » Swift 闭包趣事谈-ios学习从入门到精通尽在姬长信

Swift 闭包趣事谈-ios学习从入门到精通尽在姬长信

分享最热门的ios资讯

20160711_095904_769.jpg

闭包,老生常谈的一个乳。这次咱们再来唠叨唠叨, 看看能不能发现有用的信息。

作为变量

var double: (Int) -> Int
double = { num in
    return num * 2
}
double(2) // 4

这里声明 double 变量为 (Int) -> Int 类型,而且用闭包字面量给他赋值,然后调用它。 这时最常见的用法。

作为 Optionals

当然, Swift 有 Optionals 特性, 闭包还可以作为 Optionals:

var optionalDouble: ((Int) -> Int)?
optionalDouble?(2) // nil
optionalDouble = { num in
    return num * 2
}
optionalDouble?(2)  // 4

我们第一次调用 optionalDouble 的时候, 因为还没有给他初始值, 所以凭据 Optionals 的特性会直接返回 nil。 接下来我们给他赋值, 然后再调用, 就可以返回相应的内容了。

作为 typealias

当然,我们还可以把闭包的界说声明称 typealias ,这样就可以在以后直接界说相同的类型:

typealias DoubleFunc = (Int) -> Int
var aliasDouble: DoubleFunc

界说为常量

let constDouble = { num in
    num * 2
}
constDouble(2) //4

作为函数的参数

var array = [1,2,3,4]
array.sort({(item1: Int, item2: Int) -> Bool in return item1 < item2})

当然, 还可以简化一些,省去参数类型的声明, 让编译器隐式的找出类型:

array.sort({(item1, item2) -> Bool in return item1 < item2 })

同样, 我们还可以越发简略, 省去闭包的返回值类型声明:

array.sort({(item1, item2) in return item1 < item2 })

如果闭包是函数的最后一个参数, 那么两边的圆括号也是可以省略的:

array.sort{(item1, item2) in return item1 < item2 }

接着, 其实闭包参数名称也可以省略:

array.sort{return $0 < $1 }

因为闭包默认将最后一个语句作为返回值, 所以 return 要害字也是可以省略的:

array.sort{ $0 < $1 }

当然, 其实 sort 函数接受的不过是一个闭包,比如我们这个用于两个数值对照, 我们不必一定要自己实现, 可以这样:

array.sort(<)

< 在 Swift 其实是一个函数, 用于比较两个数值的大小,我们直接把它传进去完全符合语法。

结尾

闭包的表演到此结束, 一步一步深入后,发现闭包的观点其实很灵活也很复杂。国外有一个大神甚至把闭包的这些特性专门做了一个主页,很有意思, 大家也有兴趣的话也可以观摩一下: http://fuckingclosuresyntax.com

用意志战胜身体的惰性!

(0)

本文由 姬長信 创作,文章地址:https://blog.isoyu.com/archives/792.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:7 月 21, 2016 at 11:59 上午

关键词:

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复