-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
70 lines (50 loc) · 58.5 KB
/
atom.xml
File metadata and controls
70 lines (50 loc) · 58.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Bit侠</title>
<subtitle>侠之大者, 回家吃饭🌈</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2019-05-10T06:31:56.485Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>Bit侠</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>【iOS 搭建基础框架】编码规范 (代码格式篇)</title>
<link href="http://yoursite.com/2018/01/24/%E3%80%90iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E3%80%91%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-%E4%BB%A3%E7%A0%81%E6%A0%BC%E5%BC%8F%E7%AF%87/"/>
<id>http://yoursite.com/2018/01/24/【iOS-搭建基础框架】编码规范-代码格式篇/</id>
<published>2018-01-24T09:01:05.000Z</published>
<updated>2019-05-10T06:31:56.485Z</updated>
<content type="html"><![CDATA[<p>本篇是 <strong>【iOS 搭建基础框架】</strong>系列,<strong>编码规范</strong> 的第二篇 <strong>代码格式篇</strong>。</p><p>其他相关文章传送门如下: </p><ul><li><a href="https://coderkllee.github.io/2018/01/24/iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-(%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83%E7%AF%87" target="_blank" rel="noopener">【iOS 搭建基础框架】编码规范 (命名规范篇)</a>/ )</li></ul><hr><p>本篇内容,摘取自苹果、谷歌的文档翻译,还有网上大神们贡献的资料。 </p><a id="more"></a><p>希望能让你有所收获,没有收获也没关系,记得点赞~ 🙂</p><h2 id="代码格式"><a href="#代码格式" class="headerlink" title="代码格式"></a>代码格式</h2><h3 id="缩进"><a href="#缩进" class="headerlink" title="缩进"></a>缩进</h3><p>不要在工程里使用Tab键,使用空格来进行缩进。不要去修改<code>Xcode > Preferences > Text Editing</code>里的Tab和自动缩进的默认的 <strong>4</strong> 个空格设置,即使用 <strong>Xcode</strong> 的默认设置即可。 </p><h3 id="方法的书写"><a href="#方法的书写" class="headerlink" title="方法的书写"></a>方法的书写</h3><p>一个典型的 <strong>Objective-C</strong> 方法应该是这样的:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)writeVideoFrameWithData:(<span class="built_in">NSData</span> *)frameData timeStamp:(<span class="keyword">int</span>)timeStamp {</span><br><span class="line">...</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>在<code>-</code>和<code>(void)</code>之间应该有一个空格,第一个大括号<code>{</code>的位置在方法所在行的末尾,同样应该有一个空格。</p><p>如果一个方法有特别多的参数或者名称很长,应该将其按照<code>:</code>来对齐分行显示:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">-(<span class="keyword">id</span>)initWithModel:(IPCModle)model</span><br><span class="line">ConnectType:(IPCConnectType)connectType</span><br><span class="line">Resolution:(IPCResolution)resolution</span><br><span class="line">AuthName:(<span class="built_in">NSString</span> *)authName</span><br><span class="line">Password:(<span class="built_in">NSString</span> *)password</span><br><span class="line">MAC:(<span class="built_in">NSString</span> *)mac</span><br><span class="line">AzIp:(<span class="built_in">NSString</span> *)az_ip</span><br><span class="line">AzDns:(<span class="built_in">NSString</span> *)az_dns</span><br><span class="line">Token:(<span class="built_in">NSString</span> *)token</span><br><span class="line">Email:(<span class="built_in">NSString</span> *)email</span><br><span class="line">Delegate:(<span class="keyword">id</span><IPCConnectHandlerDelegate>)delegate;</span><br></pre></td></tr></table></figure><p>在分行时,如果第一段名称过短,后续名称可以以Tab的长度(4个空格)为单位进行缩进:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)<span class="keyword">short</span>:(GTMFoo *)theFoo</span><br><span class="line">longKeyword:(<span class="built_in">NSRect</span>)theRect</span><br><span class="line">evenLongerKeyword:(<span class="keyword">float</span>)theInterval</span><br><span class="line">error:(<span class="built_in">NSError</span> **)theError {</span><br><span class="line">...</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="方法调用"><a href="#方法调用" class="headerlink" title="方法调用"></a>方法调用</h3><p>方法调用的格式和书写差不多,可以按照方法的长短来选择写在一行或者分成多行:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//写在一行</span></span><br><span class="line">[myObject doFooWith:arg1 name:arg2 error:arg3];</span><br><span class="line"></span><br><span class="line"><span class="comment">//分行写,按照':'对齐</span></span><br><span class="line">[myObject doFooWith:arg1</span><br><span class="line">name:arg2</span><br><span class="line">error:arg3];</span><br><span class="line"></span><br><span class="line"><span class="comment">//第一段名称过短的话后续可以进行缩进</span></span><br><span class="line">[myObj <span class="keyword">short</span>:arg1</span><br><span class="line">longKeyword:arg2</span><br><span class="line">evenLongerKeyword:arg3</span><br><span class="line">error:arg4];</span><br></pre></td></tr></table></figure><p>以下写法是错误的:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//错误,要么写在一行,要么全部分行</span></span><br><span class="line">[myObject doFooWith:arg1 name:arg2</span><br><span class="line">error:arg3];</span><br><span class="line">[myObject doFooWith:arg1</span><br><span class="line">name:arg2 error:arg3];</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,按照':'来对齐,而不是关键字</span></span><br><span class="line">[myObject doFooWith:arg1</span><br><span class="line">name:arg2</span><br><span class="line">error:arg3];</span><br></pre></td></tr></table></figure><h3 id="public和-private标记符"><a href="#public和-private标记符" class="headerlink" title="@public和@private标记符"></a>@public和@private标记符</h3><p>@public和@private标记符应该以 <strong>一个空格</strong> 来进行缩进:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">@interface</span> <span class="title">MyClass</span> : <span class="title">NSObject</span> </span>{</span><br><span class="line"><span class="keyword">@public</span></span><br><span class="line">...</span><br><span class="line"><span class="keyword">@private</span></span><br><span class="line">...</span><br><span class="line">}</span><br><span class="line"><span class="keyword">@end</span></span><br></pre></td></tr></table></figure><h3 id="协议(Protocols)"><a href="#协议(Protocols)" class="headerlink" title="协议(Protocols)"></a>协议(Protocols)</h3><p>在书写协议的时候注意用<code><></code>括起来的协议和类型名之间是没有空格的,比如<code>IPCConnectHandler()<IPCPreconnectorDelegate></code>,这个规则适用所有书写协议的地方,包括方法声明、类声明、实例变量等等:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">@interface</span> <span class="title">MyProtocoledClass</span> : <span class="title">NSObject</span><<span class="title">NSWindowDelegate</span>> </span>{</span><br><span class="line"><span class="keyword">@private</span></span><br><span class="line"><span class="keyword">id</span><MyFancyDelegate> _delegate;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">- (<span class="keyword">void</span>)setDelegate:(<span class="keyword">id</span><MyFancyDelegate>)aDelegate;</span><br><span class="line"><span class="keyword">@end</span></span><br></pre></td></tr></table></figure><h3 id="闭包(Blocks)"><a href="#闭包(Blocks)" class="headerlink" title="闭包(Blocks)"></a>闭包(Blocks)</h3><p>根据block的长度,有不同的书写规则:</p><ul><li>较短的block可以写在一行内。</li><li>如果分行显示的话,block的右括号<code>}</code>应该和调用block那行代码的第一个非空字符对齐。</li><li>block内的代码采用<strong>4个空格</strong>的缩进。</li><li>如果block过于庞大,应该单独声明成一个变量来使用。</li><li><code>^</code>和<code>(</code>之间,<code>^</code>和<code>{</code>之间都没有空格,参数列表的右括号<code>)</code>和<code>{</code>之间有一个空格。</li></ul><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//较短的block写在一行内</span></span><br><span class="line">[operation setCompletionBlock:^{ [<span class="keyword">self</span> onOperationDone]; }];</span><br><span class="line"></span><br><span class="line"><span class="comment">//分行书写的block,内部使用4空格缩进</span></span><br><span class="line">[operation setCompletionBlock:^{</span><br><span class="line">[<span class="keyword">self</span>.delegate newDataAvailable];</span><br><span class="line">}];</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用C语言API调用的block遵循同样的书写规则</span></span><br><span class="line"><span class="built_in">dispatch_async</span>(_fileIOQueue, ^{</span><br><span class="line"><span class="built_in">NSString</span>* path = [<span class="keyword">self</span> sessionFilePath];</span><br><span class="line"><span class="keyword">if</span> (path) {</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">}</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">//较长的block关键字可以缩进后在新行书写,注意block的右括号'}'和调用block那行代码的第一个非空字符对齐</span></span><br><span class="line">[[SessionService sharedService]</span><br><span class="line">loadWindowWithCompletionBlock:^(SessionWindow *window) {</span><br><span class="line"><span class="keyword">if</span> (window) {</span><br><span class="line">[<span class="keyword">self</span> windowDidLoad:window];</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line">[<span class="keyword">self</span> errorLoadingWindow];</span><br><span class="line">}</span><br><span class="line">}];</span><br><span class="line"></span><br><span class="line"><span class="comment">//较长的block参数列表同样可以缩进后在新行书写</span></span><br><span class="line">[[SessionService sharedService]</span><br><span class="line">loadWindowWithCompletionBlock:</span><br><span class="line">^(SessionWindow *window) {</span><br><span class="line"><span class="keyword">if</span> (window) {</span><br><span class="line">[<span class="keyword">self</span> windowDidLoad:window];</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line">[<span class="keyword">self</span> errorLoadingWindow];</span><br><span class="line">}</span><br><span class="line">}];</span><br><span class="line"></span><br><span class="line"><span class="comment">//庞大的block应该单独定义成变量使用</span></span><br><span class="line"><span class="keyword">void</span> (^largeBlock)(<span class="keyword">void</span>) = ^{</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">};</span><br><span class="line">[_operationQueue addOperationWithBlock:largeBlock];</span><br><span class="line"></span><br><span class="line"><span class="comment">//在一个调用中使用多个block,注意到他们不是像方法那样通过':'对齐的,而是同时进行了4个空格的缩进</span></span><br><span class="line">[myObject doSomethingWith:arg1</span><br><span class="line">firstBlock:^(Foo *a) {</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">}</span><br><span class="line">secondBlock:^(Bar *b) {</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">}];</span><br></pre></td></tr></table></figure><h3 id="数据结构的字面量写法"><a href="#数据结构的字面量写法" class="headerlink" title="数据结构的字面量写法"></a>数据结构的字面量写法</h3><p>应该使用可读性更好的字面量来构造<code>NSArray</code>,<code>NSDictionary</code>等数据结构,避免使用冗长的<code>alloc</code>,<code>init</code>方法。</p><p>如果构造代码写在一行,需要在括号两端留有一个空格,使得被构造的元素于与构造语法区分开来:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确,在字面量的"[]"或者"{}"两端留有空格</span></span><br><span class="line"><span class="built_in">NSArray</span> *array = @[ [foo description], <span class="string">@"Another String"</span>, [bar description] ];</span><br><span class="line"><span class="built_in">NSDictionary</span> *dict = @{ <span class="built_in">NSForegroundColorAttributeName</span> : [<span class="built_in">NSColor</span> redColor] };</span><br><span class="line"></span><br><span class="line"><span class="comment">//不正确,不留有空格降低了可读性</span></span><br><span class="line"><span class="built_in">NSArray</span>* array = @[[foo description], [bar description]];</span><br><span class="line"><span class="built_in">NSDictionary</span>* dict = @{<span class="built_in">NSForegroundColorAttributeName</span>: [<span class="built_in">NSColor</span> redColor]};</span><br></pre></td></tr></table></figure><p>如果构造代码不写在一行内,构造元素需要使用 <strong>两个空格</strong> 来进行缩进,右括号<code>]</code>或者<code>}</code>写在新的一行,并且与调用字面量那行代码的第一个非空字符对齐:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">NSArray</span> *array = @[</span><br><span class="line"><span class="string">@"This"</span>,</span><br><span class="line"><span class="string">@"is"</span>,</span><br><span class="line"><span class="string">@"an"</span>,</span><br><span class="line"><span class="string">@"array"</span></span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="built_in">NSDictionary</span> *dictionary = @{</span><br><span class="line"><span class="built_in">NSFontAttributeName</span> : [<span class="built_in">NSFont</span> fontWithName:<span class="string">@"Helvetica-Bold"</span> size:<span class="number">12</span>],</span><br><span class="line"><span class="built_in">NSForegroundColorAttributeName</span> : fontColor</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>构造字典时,字典的Key和Value与中间的冒号<code>:</code>都要留有一个空格,多行书写时,也可以将Value对齐:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确,冒号':'前后留有一个空格</span></span><br><span class="line"><span class="built_in">NSDictionary</span> *option1 = @{</span><br><span class="line"><span class="built_in">NSFontAttributeName</span> : [<span class="built_in">NSFont</span> fontWithName:<span class="string">@"Helvetica-Bold"</span> size:<span class="number">12</span>],</span><br><span class="line"><span class="built_in">NSForegroundColorAttributeName</span> : fontColor</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">//正确,按照Value来对齐</span></span><br><span class="line"><span class="built_in">NSDictionary</span> *option2 = @{</span><br><span class="line"><span class="built_in">NSFontAttributeName</span> : [<span class="built_in">NSFont</span> fontWithName:<span class="string">@"Arial"</span> size:<span class="number">12</span>],</span><br><span class="line"><span class="built_in">NSForegroundColorAttributeName</span> : fontColor</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,冒号前应该有一个空格</span></span><br><span class="line"><span class="built_in">NSDictionary</span> *wrong = @{</span><br><span class="line">AKey: <span class="string">@"b"</span>,</span><br><span class="line">BLongerKey: <span class="string">@"c"</span>,</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,每一个元素要么单独成为一行,要么全部写在一行内</span></span><br><span class="line"><span class="built_in">NSDictionary</span> *alsoWrong= @{ AKey : <span class="string">@"a"</span>,</span><br><span class="line">BLongerKey : <span class="string">@"b"</span> };</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,在冒号前只能有一个空格,冒号后才可以考虑按照Value对齐</span></span><br><span class="line"><span class="built_in">NSDictionary</span> *stillWrong = @{</span><br><span class="line">AKey : <span class="string">@"b"</span>,</span><br><span class="line">BLongerKey : <span class="string">@"c"</span>,</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="nil检查"><a href="#nil检查" class="headerlink" title="nil检查"></a>nil检查</h3><p>因为在 <strong>Objective-C</strong> 中向nil对象发送命令是不会抛出异常或者导致崩溃的,只是完全的“什么都不干”,所以,只在程序中使用nil来做逻辑上的检查。</p><p>另外,不要使用诸如<code>nil == Object</code>或者<code>Object == nil</code>的形式来判断。</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确,直接判断</span></span><br><span class="line"><span class="keyword">if</span> (!objc) {</span><br><span class="line">... </span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,不要使用nil == Object的形式</span></span><br><span class="line"><span class="keyword">if</span> (<span class="literal">nil</span> == objc) {</span><br><span class="line">... </span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><blockquote><p>哥们,都浪到这了,顺手点个赞❤️呗~ </p></blockquote><h3 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h3><ul><li><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html" target="_blank" rel="noopener">Apple Coding Guidelines for Cocoa</a></li><li><a href="https://github.com/QianKaiLu/Objective-C-Coding-Guidelines-In-Chinese" target="_blank" rel="noopener">Objective-C-Coding-Guidelines-In-Chinese</a></li></ul>]]></content>
<summary type="html">
<p>本篇是 <strong>【iOS 搭建基础框架】</strong>系列,<strong>编码规范</strong> 的第二篇 <strong>代码格式篇</strong>。</p>
<p>其他相关文章传送门如下: </p>
<ul>
<li><a href="https://coderkllee.github.io/2018/01/24/iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-(%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83%E7%AF%87" target="_blank" rel="noopener">【iOS 搭建基础框架】编码规范 (命名规范篇)</a>/ )</li>
</ul>
<hr>
<p>本篇内容,摘取自苹果、谷歌的文档翻译,还有网上大神们贡献的资料。 </p>
</summary>
</entry>
<entry>
<title>【iOS 搭建基础框架】编码规范 (命名规范篇)</title>
<link href="http://yoursite.com/2018/01/22/%E3%80%90iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E3%80%91%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83%E7%AF%87/"/>
<id>http://yoursite.com/2018/01/22/【iOS-搭建基础框架】编码规范-命名规范篇/</id>
<published>2018-01-22T09:08:22.000Z</published>
<updated>2019-05-10T05:50:56.929Z</updated>
<content type="html"><![CDATA[<hr><p>本篇是 <strong>【iOS 搭建基础框架】</strong>系列,<strong>编码规范</strong> 的第一篇 <strong>命名规范篇</strong>。</p><p>其他相关文章传送门如下:</p><ul><li><a href="https://coderkllee.github.io/2018/01/24/iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-(%E4%BB%A3%E7%A0%81%E6%A0%BC%E5%BC%8F%E7%AF%87" target="_blank" rel="noopener">【iOS 搭建基础框架】编码规范 (代码格式篇)</a>/ )</li></ul><hr><p>本篇内容,摘取自苹果、谷歌的文档翻译,还有网上大神们贡献的资料。 </p><p>主要是为了让自己保持代码的一致性 and 传说中的优雅 🙂 ,也为以后的团队总结出一份基础的通用编码规范。(确实想的有点远 🙂) </p><p>希望能让你有所收获,没有收获也没关系,记得点赞~ 🙂</p><a id="more"></a><h2 id="命名规范"><a href="#命名规范" class="headerlink" title="命名规范"></a>命名规范</h2><h3 id="类名-Class"><a href="#类名-Class" class="headerlink" title="类名 (Class)"></a>类名 (Class)</h3><ol><li>避免潜在的命名冲突,设置 <strong>Class Prefix</strong> </li></ol><p><img src="https://user-gold-cdn.xitu.io/2018/1/24/1612605e85f83a4d?w=2048&h=613&f=jpeg&s=250834" alt="设置 Class Prefix"> </p><p>设置整个项目的统一类名前缀。<br>由于苹果公司保留使用”两个字母前缀”的所有权,所以项目里的前缀应取三个字母为宜。 </p><ol start="2"><li>类名的命名采用 <strong>大驼峰命名法</strong> 即每个单词的首字母大写。 </li></ol><hr><h3 id="类别-Category"><a href="#类别-Category" class="headerlink" title="类别 (Category)"></a>类别 (Category)</h3><p>如下:类别名添加 <strong>大写前缀 KL</strong> , 方法名添加 <strong>小写前缀 kl</strong> 。</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">NSObject</span>+KLNetworkingMethods.h</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">@interface</span> <span class="title">NSObject</span> (<span class="title">KLNetworkingMethods</span>)</span></span><br><span class="line"></span><br><span class="line">- (<span class="built_in">BOOL</span>)kl_isEmptyObject;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@end</span></span><br></pre></td></tr></table></figure><hr><h3 id="委托-Delegate"><a href="#委托-Delegate" class="headerlink" title="委托 (Delegate)"></a>委托 (Delegate)</h3><ul><li>第一个参数是触发委托的对象</li><li>第一个关键词是触发对象的类名 </li><li>除非该方法只有一个参数</li></ul><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一个关键词为触发委托的类名</span></span><br><span class="line">- (<span class="built_in">NSInteger</span>)tableView:(<span class="built_in">UITableView</span> *)tableView numberOfRowsInSection:(<span class="built_in">NSInteger</span>)section; </span><br><span class="line"></span><br><span class="line"><span class="comment">// 当只有一个"sender"参数时可以省略类名</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)applicationOpenUntitledFile:(<span class="built_in">NSApplication</span> *)sender;</span><br></pre></td></tr></table></figure><p>根据委托方法触发的时机和目的,使用should,will,did等关键词</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)browserDidScroll:(<span class="built_in">NSBrowser</span> *)sender;</span><br><span class="line"></span><br><span class="line">- (<span class="built_in">NSUndoManager</span> *)windowWillReturnUndoManager:(<span class="built_in">NSWindow</span> *)window;、</span><br><span class="line"></span><br><span class="line">- (<span class="built_in">BOOL</span>)windowShouldClose:(<span class="keyword">id</span>)sender;</span><br></pre></td></tr></table></figure><hr><h3 id="通知-Notification"><a href="#通知-Notification" class="headerlink" title="通知 (Notification)"></a>通知 (Notification)</h3><p>通知常用于在模块间传递消息,所以通知要尽可能地表示出发生的事件,通知的命名范式是: </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[触发通知的类名] + [Did | Will] + [动作] + Notification</span><br></pre></td></tr></table></figure><p>栗子🌰</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">NSApplicationDidBecomeActiveNotification</span></span><br><span class="line"><span class="built_in">UIKeyboardWillShowNotification</span></span><br><span class="line"><span class="built_in">NSUserDefaultsDidChangeNotification</span></span><br><span class="line"><span class="built_in">UITextFieldTextDidBeginEditingNotification</span></span><br></pre></td></tr></table></figure><hr><h3 id="方法-Methods"><a href="#方法-Methods" class="headerlink" title="方法(Methods)"></a>方法(Methods)</h3><p>命名采用 <strong>小驼峰命名法</strong> 即首个单词全部用小写字母,后续的单词首字母大写。 </p><p>方法名中不应该有标点符号(包括下划线),除了以下的情况: </p><ul><li>可以用带下划线的小写前缀来命名私有方法或者类别中的方法</li></ul><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)kl_setControls</span><br></pre></td></tr></table></figure><p>如果方法表示让对象执行一个动作,使用动词打头来命名,注意不要使用<code>do</code>,<code>does</code>这种多余的关键字,动词本身的暗示就足够了: </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确,使用属性名来命名方法</span></span><br><span class="line">- (<span class="built_in">NSSize</span>)cellSize;</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,添加了多余的动词前缀</span></span><br><span class="line">- (<span class="built_in">NSSize</span>)calcCellSize;</span><br><span class="line">- (<span class="built_in">NSSize</span>)getCellSize;</span><br></pre></td></tr></table></figure><p>对于有多个参数的方法,务必在每一个参数前都添加关键词,关键词应当清晰说明参数的作用:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确,保证每个参数都有关键词修饰</span></span><br><span class="line">- (<span class="keyword">void</span>)sendAction:(SEL)aSelector toObject:(<span class="keyword">id</span>)anObject forAllCells:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,遗漏关键词</span></span><br><span class="line">- (<span class="keyword">void</span>)sendAction:(SEL)aSelector :(<span class="keyword">id</span>)anObject :(<span class="built_in">BOOL</span>)flag;</span><br><span class="line"></span><br><span class="line"><span class="comment">//正确</span></span><br><span class="line">- (<span class="keyword">id</span>)viewWithTag:(<span class="built_in">NSInteger</span>)aTag;</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,关键词的作用不清晰</span></span><br><span class="line">- (<span class="keyword">id</span>)taggedView:(<span class="keyword">int</span>)aTag;</span><br></pre></td></tr></table></figure><p>不要用<code>and</code>来连接两个参数,通常<code>and</code>用来表示方法执行了两个相对独立的操作(<em>从设计上来说,这时候应该拆分成两个独立的方法</em>):</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//错误,不要使用"and"来连接参数</span></span><br><span class="line">- (<span class="keyword">int</span>)runModalForDirectory:(<span class="built_in">NSString</span> *)path andFile:(<span class="built_in">NSString</span> *)name andTypes:(<span class="built_in">NSArray</span> *)fileTypes;</span><br><span class="line"></span><br><span class="line"><span class="comment">//正确,使用"and"来表示两个相对独立的操作</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)openFile:(<span class="built_in">NSString</span> *)fullPath withApplication:(<span class="built_in">NSString</span> *)appName andDeactivate:(<span class="built_in">BOOL</span>)flag;</span><br></pre></td></tr></table></figure><p>方法的参数命名也有一些需要注意的地方: </p><ul><li>和方法名类似,参数的第一个字母小写,后面的每一个单词首字母大写</li><li>不要再方法名中使用类似<code>pointer</code>,<code>ptr</code>这样的字眼去表示指针,参数本身的类型足以说明</li><li>不要使用只有一两个字母的参数名</li><li>不要使用简写,拼出完整的单词 </li></ul><hr><h3 id="存取方法(Accessor-Methods)"><a href="#存取方法(Accessor-Methods)" class="headerlink" title="存取方法(Accessor Methods)"></a>存取方法(Accessor Methods)</h3><p>存取方法是指用来获取和设置类属性值的方法,属性的不同类型,对应着不同的存取方法规范:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//属性是一个名词时的存取方法范式</span></span><br><span class="line">- (type)noun;</span><br><span class="line">- (<span class="keyword">void</span>)setNoun:(type)aNoun;</span><br><span class="line"><span class="comment">//栗子</span></span><br><span class="line">- (<span class="built_in">NSString</span> *)title;</span><br><span class="line">- (<span class="keyword">void</span>)setTitle:(<span class="built_in">NSString</span> *)aTitle;</span><br><span class="line"></span><br><span class="line"><span class="comment">//属性是一个形容词时存取方法的范式</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)isAdjective;</span><br><span class="line">- (<span class="keyword">void</span>)setAdjective:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line"><span class="comment">//栗子</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)isEditable;</span><br><span class="line">- (<span class="keyword">void</span>)setEditable:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line"></span><br><span class="line"><span class="comment">//属性是一个动词时存取方法的范式</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)verbObject;</span><br><span class="line">- (<span class="keyword">void</span>)setVerbObject:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line"><span class="comment">//栗子</span></span><br><span class="line">- (<span class="built_in">BOOL</span>)showsAlpha;</span><br><span class="line">- (<span class="keyword">void</span>)setShowsAlpha:(<span class="built_in">BOOL</span>)flag;</span><br></pre></td></tr></table></figure><p>命名存取方法时不要将动词转化为被动形式来使用: </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确</span></span><br><span class="line">- (<span class="keyword">void</span>)setAcceptsGlyphInfo:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line">- (<span class="built_in">BOOL</span>)acceptsGlyphInfo;</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,不要使用动词的被动形式</span></span><br><span class="line">- (<span class="keyword">void</span>)setGlyphInfoAccepted:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line">- (<span class="built_in">BOOL</span>)glyphInfoAccepted;</span><br></pre></td></tr></table></figure><p>可以使用<code>can</code>,<code>should</code>,<code>will</code>等词来协助表达存取方法的意思,但不要使用<code>do</code>,和<code>does</code>: </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//正确</span></span><br><span class="line">- (<span class="keyword">void</span>)setCanHide:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line">- (<span class="built_in">BOOL</span>)canHide;</span><br><span class="line">- (<span class="keyword">void</span>)setShouldCloseDocument:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line">- (<span class="built_in">BOOL</span>)shouldCloseDocument;</span><br><span class="line"></span><br><span class="line"><span class="comment">//错误,不要使用"do"或者"does"</span></span><br><span class="line">- (<span class="keyword">void</span>)setDoesAcceptGlyphInfo:(<span class="built_in">BOOL</span>)flag;</span><br><span class="line">- (<span class="built_in">BOOL</span>)doesAcceptGlyphInfo;</span><br></pre></td></tr></table></figure><p>为什么 <strong>Objective-C</strong> 中不适用<code>get</code>前缀来表示属性获取方法?因为<code>get</code>在 <strong>Objective-C</strong> 中通常只用来表示从函数指针返回值的函数: </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//三个参数都是作为函数的返回值来使用的,这样的函数名可以使用"get"前缀</span></span><br><span class="line">- (<span class="keyword">void</span>)getLineDash:(<span class="keyword">float</span> *)pattern count:(<span class="keyword">int</span> *)count phase:(<span class="keyword">float</span> *)phase;</span><br></pre></td></tr></table></figure><hr><h3 id="集合操作类方法(Collection-Methods)"><a href="#集合操作类方法(Collection-Methods)" class="headerlink" title="集合操作类方法(Collection Methods)"></a>集合操作类方法(Collection Methods)</h3><p>有些对象管理着一系列其它对象或者元素的集合,需要使用类似“增删查改”的方法来对集合进行操作,这些方法的命名范式一般为:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//集合操作范式</span></span><br><span class="line">- (<span class="keyword">void</span>)addElement:(elementType)anObj;</span><br><span class="line">- (<span class="keyword">void</span>)removeElement:(elementType)anObj;</span><br><span class="line">- (<span class="built_in">NSArray</span> *)elements;</span><br><span class="line"></span><br><span class="line"><span class="comment">//栗子</span></span><br><span class="line">- (<span class="keyword">void</span>)addLayoutManager:(<span class="built_in">NSLayoutManager</span> *)obj;</span><br><span class="line">- (<span class="keyword">void</span>)removeLayoutManager:(<span class="built_in">NSLayoutManager</span> *)obj;</span><br><span class="line">- (<span class="built_in">NSArray</span> *)layoutManagers;</span><br></pre></td></tr></table></figure><p>注意,如果返回的集合是无序的,使用<code>NSSet</code>来代替<code>NSArray</code>。如果需要将元素插入到特定的位置,使用类似于这样的命名:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)insertLayoutManager:(<span class="built_in">NSLayoutManager</span> *)obj atIndex:(<span class="keyword">int</span>)index;</span><br><span class="line">- (<span class="keyword">void</span>)removeLayoutManagerAtIndex:(<span class="keyword">int</span>)index;</span><br></pre></td></tr></table></figure><p>如果管理的集合元素中有指向管理对象的指针,要设置成<code>weak</code>类型以防止引用循环。</p><p>下面是SDK中<code>NSWindow</code>类的集合操作方法:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- (<span class="keyword">void</span>)addChildWindow:(<span class="built_in">NSWindow</span> *)childWin ordered:(<span class="built_in">NSWindowOrderingMode</span>)place;</span><br><span class="line">- (<span class="keyword">void</span>)removeChildWindow:(<span class="built_in">NSWindow</span> *)childWin;</span><br><span class="line">- (<span class="built_in">NSArray</span> *)childWindows;</span><br><span class="line">- (<span class="built_in">NSWindow</span> *)parentWindow;</span><br><span class="line">- (<span class="keyword">void</span>)setParentWindow:(<span class="built_in">NSWindow</span> *)window;</span><br></pre></td></tr></table></figure><hr><h3 id="命名属性和实例变量(Properties-amp-Instance-Variables)"><a href="#命名属性和实例变量(Properties-amp-Instance-Variables)" class="headerlink" title="命名属性和实例变量(Properties&Instance Variables)"></a>命名属性和实例变量(Properties&Instance Variables)</h3><p>属性和对象的存取方法相关联,属性的第一个字母小写,后续单词首字母大写,不必添加前缀。属性按功能命名成名词或者动词:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//名词属性</span></span><br><span class="line"><span class="keyword">@property</span> (<span class="keyword">strong</span>) <span class="built_in">NSString</span> *title;</span><br><span class="line"></span><br><span class="line"><span class="comment">//动词属性</span></span><br><span class="line"><span class="keyword">@property</span> (<span class="keyword">assign</span>) <span class="built_in">BOOL</span> showsAlpha;</span><br></pre></td></tr></table></figure><p>属性也可以命名成形容词,这时候通常会指定一个带有<code>is</code>前缀的get方法来提高可读性:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@property</span> (<span class="keyword">assign</span>, <span class="keyword">getter</span>=isEditable) <span class="built_in">BOOL</span> editable;</span><br></pre></td></tr></table></figure><p>命名实例变量,在变量名前加上<code>_</code>前缀(<em>有些有历史的代码会将<code>_</code>放在后面</em>),其它和命名属性一样:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">@implementation</span> <span class="title">MyClass</span> </span>{</span><br><span class="line"><span class="built_in">BOOL</span> _showsTitle;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>一般来说,类需要对使用者隐藏数据存储的细节,所以不要将实例方法定义成公共可访问的接口,可以使用<code>@private</code>,<code>@protected</code>前缀。</p><p>按苹果的说法,不建议在除了<code>init</code>和<code>dealloc</code>方法以外的地方直接访问实例变量,但很多人认为直接访问会让代码更加清晰可读,只在需要计算或者执行操作的时候才使用存取方法访问,我就是这种习惯,所以这里不作要求。</p><p>###命名常量(Constants)</p><p>如果要定义一组相关的常量,尽量使用枚举类型(enumerations),枚举类型的命名规则和函数的命名规则相同。<br>建议使用 <code>NS_ENUM</code> 和 <code>NS_OPTIONS</code> 宏来定义枚举类型,参见官方的 <a href="https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html" target="_blank" rel="noopener">Adopting Modern Objective-C</a> 一文:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//定义一个枚举</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="built_in">NS_ENUM</span>(<span class="built_in">NSInteger</span>, <span class="built_in">NSMatrixMode</span>) {</span><br><span class="line"><span class="built_in">NSRadioModeMatrix</span>,</span><br><span class="line"><span class="built_in">NSHighlightModeMatrix</span>,</span><br><span class="line"><span class="built_in">NSListModeMatrix</span>,</span><br><span class="line"><span class="built_in">NSTrackModeMatrix</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>定义bit map:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="built_in">NS_OPTIONS</span>(<span class="built_in">NSUInteger</span>, <span class="built_in">NSWindowMask</span>) {</span><br><span class="line"><span class="built_in">NSBorderlessWindowMask</span> = <span class="number">0</span>,</span><br><span class="line"><span class="built_in">NSTitledWindowMask</span> = <span class="number">1</span> << <span class="number">0</span>,</span><br><span class="line"><span class="built_in">NSClosableWindowMask</span> = <span class="number">1</span> << <span class="number">1</span>,</span><br><span class="line"><span class="built_in">NSMiniaturizableWindowMask</span> = <span class="number">1</span> << <span class="number">2</span>,</span><br><span class="line"><span class="built_in">NSResizableWindowMask</span> = <span class="number">1</span> << <span class="number">3</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>使用<code>const</code>定义浮点型或者单个的整数型常量,如果要定义一组相关的整数常量,应该优先使用枚举。常量的命名规范和函数相同:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">float</span> <span class="built_in">NSLightGray</span>;</span><br></pre></td></tr></table></figure><p>不要使用<code>#define</code>宏来定义常量,如果是整型常量,尽量使用枚举,浮点型常量,使用<code>const</code>定义。<code>#define</code>通常用来给编译器决定是否编译某块代码,比如常用的:</p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#ifdef DEBUG</span></span><br></pre></td></tr></table></figure><p>注意到一般由编译器定义的宏会在前后都有一个<code>__</code>,比如<em><code>__MACH__</code></em>。</p><hr><h3 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h3><h4 id="文件注释"><a href="#文件注释" class="headerlink" title="文件注释"></a>文件注释</h4><p>每一个文件都 <strong>必须</strong> 写文件注释,文件注释最基本的应包含 </p><ul><li>文件名称</li><li>作者信息(<em>姓名、邮箱、Github等</em>)</li><li>文件的描述,及其作用</li><li>版本信息 </li></ul><p>最基础的文件注释栗子🌰 </p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*******************************************************************************</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">File name: AppDelegate.h</span></span><br><span class="line"><span class="comment">Author: Ferryman (Li KaiLong)</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">Description:</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">History:</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">********************************************************************************/</span></span><br></pre></td></tr></table></figure><p>在 <strong>Xcode</strong> 里,创建的新文件都有默认的文件注释,可通过 <strong>Xcode 9</strong> 的 <strong>自定义文本宏</strong> 新特性统一添加我们的文件注释模块,保持整个工程统一的文件注释风格。 <strong>重要!很重要!! 非常重要!!!</strong></p><h4 id="代码注释"><a href="#代码注释" class="headerlink" title="代码注释"></a>代码注释</h4><p>“自解释”(self-documenting)的代码是我们应该做到的,但仍然需要详细的注释来说明参数的意义、返回值、功能以及可能的副作用。</p><p>方法、类、协议、类别的定义都需要注释,推荐采用Apple的标准注释风格,好处是可以在引用的地方<code>option + 鼠标左键</code>自动弹出注释,非常方便。</p><p>生成注释格式的方法采用 <strong>Xcode</strong> 自带的注释快捷键功能 </p><ul><li>单行注释:在需要注释的地方按 <code>command + /</code></li><li>标注: 在属性或者方法名的上面(<em>空白</em>) 的地方按 <code>command + option + /</code></li></ul><p><img src="https://user-gold-cdn.xitu.io/2018/1/24/1612605e6a1fd1b7?w=816&h=254&f=gif&s=955026" alt="AnnotationTemplateGif"> </p><p>特别注意: </p><ul><li><p>协议、委托的注释要明确说明其被触发的条件</p></li><li><p>如果在注释中要引用参数名或者方法函数名,使用<code>||</code>将参数或者方法括起来以避免歧义:</p></li></ul><p><strong>定义在头文件里的接口方法、属性必须要有注释!</strong></p><p><code>哥们,都浪到这了,顺手点个赞❤️呗~</code></p><h3 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h3><ul><li><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html" target="_blank" rel="noopener">Apple Coding Guidelines for Cocoa</a></li><li><a href="https://github.com/QianKaiLu/Objective-C-Coding-Guidelines-In-Chinese" target="_blank" rel="noopener">Objective-C-Coding-Guidelines-In-Chinese</a></li></ul>]]></content>
<summary type="html">
<hr>
<p>本篇是 <strong>【iOS 搭建基础框架】</strong>系列,<strong>编码规范</strong> 的第一篇 <strong>命名规范篇</strong>。</p>
<p>其他相关文章传送门如下:</p>
<ul>
<li><a href="https://coderkllee.github.io/2018/01/24/iOS-%E6%90%AD%E5%BB%BA%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83-(%E4%BB%A3%E7%A0%81%E6%A0%BC%E5%BC%8F%E7%AF%87" target="_blank" rel="noopener">【iOS 搭建基础框架】编码规范 (代码格式篇)</a>/ )</li>
</ul>
<hr>
<p>本篇内容,摘取自苹果、谷歌的文档翻译,还有网上大神们贡献的资料。 </p>
<p>主要是为了让自己保持代码的一致性 and 传说中的优雅 🙂 ,也为以后的团队总结出一份基础的通用编码规范。(确实想的有点远 🙂) </p>
<p>希望能让你有所收获,没有收获也没关系,记得点赞~ 🙂</p>
</summary>
</entry>
</feed>