几个 Swift 代码规范
我们需要经常带着新问题来重新审视一下以前的代码规范。 Kevin 提供的一套规范:“如果尾部的闭包参数是函数式的就用圆括号。如果是程序式的就用花括号。” myCollection.map({blah}).filter({blah}).etc myCollection.forEach {} // 或者 dispatch_after(when,queue) {} 样式一致性与闭包是否有返回值相关。目前存在的争议是我们是否应该在尾部花括号的左边留空格。
仔细考虑下面 for (flagLessOne,string) in strings.enumerate() where contains( Features(rawValue: 1<<(flagLessOne + 1))) { nameArray.append(string) } 完全合格的调用明确指出了原本模糊不清的对象,同时极大滴提高了代码的可读性: for (flagLessOne,string) in strings.enumerate() where self.contains( Features(rawValue: 1<<(flagLessOne + 1))) { nameArray.append(string) } 条件级联绑定的规范:“除非你做的是 不要使用下面的方式: if let x = x,let y = y,let z = z {blah} 使用这种: if let x = x,y = y,z = z {blah} 省略多余的 if let x = x,z = z { ...blah... } 尽管级联绑定避免了 pre-Swift 2 中的“鞭尸金字塔(pyramids of doom)“,但它们又导致了“恐怖便秘块(constipated blocks of horror)“的问题。这种问题主要出现在下面两种情况:
模式匹配关键字的规范:“如果都是绑定,那就要把绑定组合起来。” 通过把关键字移动到元组外面的方式来把多模式匹配绑定组合起来。将下面的代码: if case (let x?,let y?) = myOptionalTuple { print(x,y) } 替换为: if case let (x?,y?) = myOptionalTuple { print(x,y) }
func doThis() -> Void func notThis() -> ()
创建集合的规范:“使用显式类型和空集合。”类型在赋值操作符的左边,空实例在赋值操作符的右边。 把下面的代码: var x = [String: Int]() // 以及 var y = [Double]() var z = Set<String>() var mySet = MyOptionSet() 替换为: var x: [String: Int] = [:] var y: [Double] = [] var z: Set<String> = [] var mySet: MyOptionSet = [] 引用 “Mike Ash”的冒号规范:“右侧加上空格,而左侧不需要。”Or no soup for you! 应该使用: [key: value] // 以及 struct Foo: MyProtocol 而不是: [key : value] struct Foo : MyProtocol 从 Objective-C 过来的规范:
更新 当然,这不是说说而已,我已经在代码中进行了实践:
github 代码地址
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |