Swift--规范编程

  • 命名规范
  • 注释规范
  • 声明
  • 代码排版

命名规范

常用命名方法
  • 匈牙利命名,一般只是命名变量,原则是: 变量名 = 类型前缀 + 描述,如bFoo表示布尔类型变量,pFoo表示指针类型变量。匈牙利命名还是有一定争议的,在Swift编码规范基本不被采用。

  • 驼峰命名(Camel-Case),又称“骆驼命名法”,是指混合使用大小写字母来命名。驼峰命名又分为小驼峰法和大驼峰法。小驼峰法就是第一个单词是全部小写,如myRoomCount;大驼峰法是第一个单词的首字母也大写,如ClassRoom。

Swift编码命名规范
  • 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法,如 SplitViewController。

  • 文件名采用大驼峰法,如BlockOperation.swift。

  • 对于扩展文件,有时扩展定义在一个独立的文件中,用“原始类型名 + 扩展名”作为扩展文件名,如NSOperation + Operations.swift。

  • 变量和属性采用小驼峰法,如studentNumber。

  • 常量采用大驼峰法, 如MaxStudentNumber。

  • 枚举成员与常量类似,采用大驼峰法,如ExecutionFailed。

  • 函数和方法采用小驼峰法,如balanceAccount、isButtonPressed等。

注释规范

注释规范有:

  • 文件规范
  • 文档注释
  • 代码注释
  • 使用地标注释
文件注释

文件注释就是在每一个文件开头添加注释。文件注释通常包括如下信息:版权信息、文件名、所在模块、作者信息、历史版本信息、文件内容和作用等。
如下图:


image.png
文档注释

文档注释是指这种注释内容能够生成API帮助文档。文档注释主要对类型、属性、方法或函数等进行注释。

  • 单行文档注释(///)
  • 多行文档注释(/*.../)

如下图:


image.png
代码注释

程序代码中处理文档注释还需要在一些关键的地方添加代码注释,文档注释一般是给一些看不到源代码的人看的帮助文档,而代码注释是给阅读源代码的人参考的。

  • 单行注释( // )
  • 多行注释 ( /.../ )
使用地标注释
  • MARK, 用于方法或函数的注释;
  • TODO, 表示这里的代码有没有完成或者还要处理;
  • FIXME,表示这里修改了代码。

声明

  • 变量或常量声明
  • 属性声明

1、变量或常量声明时,每行声明变量或常量的数量推荐一行一个,因为这样有利于写注释。

推荐使用:

let level = 0
var size = 10

不推荐使用:

let level,   le2,   le3 = 0;   var size = 10

2、还有变量或常量的数据类型,如果有可能应尽量采用类型推断,这样代码更简洁。
推荐使用:

let level = 0
var size = 10

不推荐使用:

let level: Int = 0
var size: Int = 10

3、 如果不是默认数据类型,我们需要声明变量或常量的数据类型,示例代码如下:

let level: Int8 = 0
var size: Int64 = 10

4、指定数据类型时需要使用冒号(:),变量或常量与冒号之间没有空格,冒号和数据类型之间要有一个空格。示例代码如下:

推荐使用:

let level: Int8 = 0
var size: Int64 = 10

不推荐使用:

let level : Int8 = 0
var size: Int64=10

5、使用数据类型时应尽可能使用Swift本身的数据类型,例如:
推荐使用:

let width = 120.0
let widthString = "Hello."
var deviceModels: [String]
var employees: [Int: String]

不推荐使用:

let width:  NsNumber = 120.0
let widthString: NSString = "Hello."
var deviceModels: NSArray
var employees: NSDictionary


  • 如果是存储属性,声明规范与变量或常量声明的规范一样。
  • 如果是计算属性,声明规范类似于代码块,特别是在使用只读计算属性时,应尽量省略get语句。

推荐使用:

var fullName: String  {
    return firstName + "." + lastName
}

不推荐使用:

var fullName: String  {
     get {
           return  firstName  +  "."  +  lastName
      }
}

代码排版

  • 空行
  • 空格
  • 断行
  • 缩进
空行
  • 类型声明之前
  • import语句前后
  • 两个方法或函数之间
  • 块注释或单行注释之前
  • 一个源文件的两个片段之间
空格

1、赋值符号“=”前后各有一个空格。var 或let 与标识符之间有一个空格。所有的二元运算符都应该使用空格与操作符分开。一元操作符和操作数之间不应该有空格,如++、--等。
示例如下:

var a = 10
var c = 10
a += c + d

2、(2)小左括号“("之后,小右括号“)”之前不应该有空。
示例如下:

a = (a + b) / (c * d)

3、大左括号“{”之前有一个空格,示例如下:

while a == d {
    n++
}

4、在方法或函数名与第一参数之间没有空格,后面的参数前应该有一个空格,参数冒号与数据类型之间也有一个空格。
推荐使用:

 func tableView(_ tableView: UITableView, didSelectRowAt   indexPath: IndexPath) {
     ...
}

不推荐使用:

func tableView ( _ tableView: UITableView, didSelectRowAt   indexPath: IndexPath) {
     ...
}
断行
  • 在一个逗号后面断开

  • 在一个操作符前面断开,要选择较高级别的运算符(而非较低级别的运算符)断开

  • 新的一行应该相对于上一行缩进两个级别(8个空格)。

例如:

(1)
 longName1 = longName2 * (longName3 + longName4 - longName5)
    + 4 * longName6

  (2)
 longName1 = longName2 * (longName3 + longName4 
  - longName5) + 4 * longName6

//代码第(1)行的断开位置要比第(2)行的断开位置好。因为代码第(1)行断开位于括号表达式的外边,这是个较高级别的断开。

(3)
 func tableView(_ tableView: UITableView, 
                            cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
 }

//代码第(3)行是方法名断开,函数名断开的规则与方法的一样。

(4)
if longName1 == longName2
        || longName3 == longName4 && longName3 > longName4
&& longName2 > longName5 {
        print(true)
}

//代码第4行是if判断语句,由于可能有很多长的表达式,断开的位置应在逻辑运算符处。

(5)
boolName1 = (longName3 == longNmae4)
        ? longName3 > longName4
        : longName2 > longName5

//代码第(5)行是三元运算符的断开。


缩进
  • 在函数、方法、闭包、控制语句、计算属性等包含大括号“{}”的代码块中,代码块的内容相对于首行缩进一个级别(4个空格)。

  • 如果是if语句中条件表达式的断行,那么新的一行应该相对于上一行缩进两个级别(8个空格),再往后的断行要与第一次的断行对齐。

image.png

如上图:代码第1行和第2行是if语句条件表达式的断行,代码第1行和第2行要对齐。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354