命名

推荐

class UserInfo{

var userName: String

var userAge: String

}

funcupdateUserInfo(userName: String, userAge: Int)

// "HTML" is at the start of a constant name, so we use lowercase "html"

let htmlBodyContent: String = "<p>Hello, World!</p>"

// Prefer using ID to Idlet profileID: Int = 1

// Prefer URLFinder to UrlFinder

  • 使用前缀 k 大骆驼命名法 为所有非单例的静态常量命名。

  • 不要缩写,简写命名,或用单个字母命名。

  • // 推荐

    class RoundAnimatingButton: UIButton {

    let animationDuration: NSTimeInterval

    func startAnimating() {

    let firstSubview = subviews.first

    }

    }

    // 不推荐

    class RoundAnimating: UIButton {

    let aniDur: NSTimeInterval

    func srtAnmating() {

    let v = subviews.first

    }

    }

    格式

    在团队开发过程中,代码格式非常重要,保持良好的代码编写习惯。

    swift系统扫盲(技术帖Swift代码规范)(1)

    class PPClass {

    func ppMethod(){

    if x == y {

    /* .... */

    } else if x == z {

    /* .... */

    } else {

    /* .... */

    }

    }

    /* .... */

    }

    // 指定类型

    let age: Int = 27

    // 字典语法(注意这里是向左对齐而不是分号对齐)

    let userInfo: [String: AnyObject] = [

    "userName": "Austin",

    "age": 27]

    // 声明函数

    func myFunction<t, u: someprotocol where t.relatedtype == u>(firstArgument: U, secondArgument: T) {

    /* ... */

    }

    // 调用函数

    someFunction(someArgument: "Austin")

    // 父类

    class CustomViewController: UIViewController {

    /* ... */

    }

    // 协议

    extension PirateViewController: UITableViewDataSource {

    /* ... */

    }</t, u: someprotocol where t.relatedtype == u>

    let array = [1, 2, 3, 4, 5]

    let sum = 20 (30 / 2) * 3

    if 2 3 == 5 {

    fatalError("The universe is broken.")

    }

    func pancake() -> Pancake {

    /* ... */

    }

    someFunction(

    first: "Hello, I am Austin",

    second: resultFromSomeFunction()

    third: someOtherLocalVariable)

    // 推荐

    let firstCondition = x == firstReallyReallyLongPredicateFunction()

    let secondCondition = y == secondReallyReallyLongPredicateFunction()

    let thirdCondition = z == thirdReallyReallyLongPredicateFunction()

    if firstCondition && secondCondition && thirdCondition {

    // 你要干什么

    }

    // 不推荐

    if x == firstReallyReallyLongPredicateFunction()

    && y == secondReallyReallyLongPredicateFunction()

    && z == thirdReallyReallyLongPredicateFunction() {

    // 你要干什么

    }

    风格

    // 推荐

    let stringOfInts = [1, 2, 3].flatMap { String($0) }

    // ["1", "2", "3"]

    // 不推荐

    var stringOfInts: [String] = []

    for integer in [1, 2, 3] {

    stringOfInts.append(String(integer))

    }

    // 推荐

    let evenNumbers = [4, 8, 15, 16, 23, 42].filter { $0 % 2 == 0 }

    // [4, 8, 16, 42]

    // 不推荐

    var evenNumbers: [Int] = []

    for integer in [4, 8, 15, 16, 23, 42] {

    if integer % 2 == 0 {

    evenNumbers(integer)

    }

    }

    func UserName() -> (firstName: String, lastName: String) {

    return ("Guybrush", "Threepwood")

    }

    let name = UserName()

    let firstName = name.firstName

    let lastName = name.lastName

    myFunctionWithClosure() { [weak self] (error) -> Void in

    // 方案 1

    self?.doSomething()

    // 或方案 2

    guard let strongSelf = self else {

    return

    }

    strongSelf.doSomething()

    }

    // 推荐

    if x == y {

    /* ... */

    }

    // 不推荐

    if (x == y) {

    /* ... */

    }

    // 推荐

    imageView.setImageWithURL(url, type: .person)

    // 不推荐

    imageView.setImageWithURL(url, type: AsyncImageView.Type.person)

    // 推荐

    imageView.backgroundColor = UIColor.whiteColor

    // 不推荐

    imageView.backgroundColor = .whiteColor

    // 推荐

    public class Pirate {

    /* ... */

    }

    // 不推荐

    public

    class Pirate {

    /* ... */

    }

    不推荐使用自定义操作符,如果需要创建函数来替代。

    在重写操作符之前,请慎重考虑是否有充分的理由一定要在全局范围内创建新的操作符,而不是使用其他策略。

    你可以重载现有的操作符来支持新的类型(特别是 ==),但是新定义的必须保留操作符的原来含义,比如 == 必须用来测试是否相等并返回布尔值。

    // 推荐

    if someOptional != nil {

    // 你要做什么

    }

    // 不推荐

    if let _ = someOptional {

    // 你要做什么

    }

    // 推荐

    func eatDoughnut(atIndex index: Int) {

    guard index >= 0 && index < doughnuts else {

    // 如果 index 超出允许范围,提前返回。

    return

    }

    let doughnut = doughnuts[index]

    eat(doughnut)

    }

    // 不推荐

    func eatDoughnuts(atIndex index: Int) {

    if index >= 0 && index < donuts.count {

    let doughnut = doughnuts[index]

    eat(doughnut)

    }

    }

    如果需要在2个状态间做出选择,建议使用if 语句,而不是使用 guard 语句。

    // 推荐

    if isFriendly {

    print("你好, 远路来的朋友!")

    } else {

    print(“穷小子,哪儿来的?")

    }

    // 不推荐

    guard isFriendly else {

    print("穷小子,哪儿来的?")

    return

    }

    print("你好, 远路来的朋友!")

    文档与注释

    如果一个函数比较复杂,通常需要给函数添加注释文档。使用苹果标准的方式进行注册 option command /进行注释 请务必查看在Apple文档中描述的Swift的注释标记中提供的全部功能。

    指南:

    class Human {

    /**

    This method feeds a certain food to a person.

    - parameter food: The food you want to be eaten.

    - parameter person: The person who should eat the food.

    - returns: True if the food was eaten by the person; false otherwise.

    */

    func feed(_ food: Food, to person: Human) -> Bool {

    // ...

    }

    }

    /**

    ## Feature Support

    This class does some awesome things. It supports:

    - Feature 1

    - Feature 2

    - Feature 3

    ## Examples

    Here is an example use case indented by four spaces because that indicates a

    code block:

    let myAwesomeThing = MyAwesomeClass()

    myAwesomeThing.makeMoney()

    ## Warnings

    There are some things you should be careful of:

    1. Thing one

    2. Thing two

    3. Thing three

    */

    class MyAwesomeClass {

    /* ... */

    }

    / **

    这样做会有一个“UIViewController”,有时间。

    - 警告:在运行此函数之前,请确保`someValue`为`true`。

    * /

    func myFunction() {

    / * ... * /

    }

    class Pirate{

    // MARK: - 实例属性

    private let pirateName : String

    // MARK: - 初始化

    init() {

    / * ... * /

    }

    }

    ,