Swift 代码小抄
无论是你学习的第一门语言是 Swift 还是之前学过 Objective-C,在学习 Swift 的过程中,一定会感叹它真的是一门超赞的语言。但如果你不熟悉它的某些语法,就可能会被某些写法吓到。在这里我会介绍一些在写 Swift 过程中常见语法,希望你们能用 Swift 写出更简洁的代码。 Closures(闭包)() -> Void Closure 在 C 或 Objective-C 中也被称为 "unnamed function"(匿名函数) 或者 "block"(代码块)。你可以把闭包当成一个值,传来传去,当然也可以把它当成函数的参数。 如果你之前有过 iOS 开发经验,那么很有可能调用过这个 UIView 的动画 API: class func animate(withDuration duration: NSTimeInterval,animations: @escaping () -> Void) 可以在 UIView.animate(withDuration: 10.0,animations: { button.alpha = 0 }) 这个 Trailing closures(尾随闭包)UIView.animate(withDuration: 10.0) { button.alpha = 0 } Swift 使用这种方式来减少不必要的语法。如果你仔细看上面的代码就会发现,这和之前在 closure 中举的例子使用的是相同的 API,唯一的区别是它的语法被简化了。 因为 func say(_ message: String,completion: @escaping () -> Void) { print(message) completion() } ... say("Hello",completion: { // prints: "Hello" // Do some other stuff }) say("Hello") { // prints: "Hello" // Do some other stuff } Type Alias(类型别名)typealias Typealias 是一个能让我们的写代码的时候避免一直重复的实用小工具。有这样一个函数,参数是一个闭包, func dance(do: (Int,String,Double) -> (Int,Double)) { } 起初这还挺直接容易理解的,但如果把这个闭包传到其它函数中去呢?我们还要记住这个闭包的签名,而且在每一个它出现的地方都要确保它的签名是正确的。如果有的地方写错了,编译器就会报错。 func dance(do: (Int,Double)) { } func sing(do: (Int,Double)) { } func act(do: (Int,Double)) { } 如果我们修改了这个闭包的签名,问题就出现了。比如交换了其中参数或者返回值的顺序。我们就得把每一个用到的地方都改一下。这个时候 typealias TripleThreat = (Int,Double) ... func dance(dance: TripleThreat) { } func act(act: TripleThreat) { } func sing(sing: TripleThreat) { } 这样就好多了,用 比较「有名的」typealias typealias Void = () typealias NSTimeInterval = Double 简写参数名$0,$1,$2... 如果一个闭包有一个或多个参数,Swift 允许我们给它们定义变量名, func say(_ message: String,completion: (_ goodbye: String) -> Void) { print(message) completion("Goodbye") } ... say("Hi") { (goodbye: String) -> Void in print(goodbye) } // prints: "Hi" // prints: "Goodbye" 在这个例子中,尾随闭包有一个名为 (goodbye: String) -> Void in 上面的其实都没有什么存在的必要性,因为可以使用简化的参数名, say("Hi") { print($0) } // prints: "Hi" // prints: "Goodbye" 可以看到,省略了 如果闭包的参数多于一个,对于每一个后面的参数,增加简写参数的数字就可以了。 (goodbye: String,name: String,age: Int) -> Void in // $0: goodbye // $1: name // $2: age 返回
|
- objective-c – OpenGL,glDrawArrays和IOS,Bad Access?
- schema – Datomic – db / isComponent等效于强制执行外键
- cocos2dx-v3.5 2048(三):菜单实现
- ruby-on-rails-3 – 管理员注释模型的ActiveAdmin菜单排序
- ‘xmlParseEntityRef:no name’在将xml加载到php文件时发出
- Swift初学习
- React PureComponent 源码解析
- 010Editor 5.0.2 附注册机 附elf,dex,xml文件格式分析模板
- c – 如果在构造函数中抛出异常,最好的做法是防止内存泄漏?
- React一——起源、安装、jsx