-
Notifications
You must be signed in to change notification settings - Fork 0
/
local-search.xml
20 lines (9 loc) · 14.6 KB
/
local-search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Swift最佳实践建议</title>
<link href="/2022/04/21/Swift%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE/"/>
<url>/2022/04/21/Swift%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE/</url>
<content type="html"><![CDATA[<h4 id="1-能用let,尽量不用var"><a href="#1-能用let,尽量不用var" class="headerlink" title="1. 能用let,尽量不用var"></a>1. 能用let,尽量不用var</h4><p>把代码里的<code>var</code>全改成<code>let</code>,只保留编译不能通过的。</p><h4 id="2-尽量不用!"><a href="#2-尽量不用!" class="headerlink" title="2. 尽量不用!"></a>2. 尽量不用!</h4><p><code>!</code>遇到<code>nil</code>时会 crash(包括<code>as!</code>进行强制转换)。可以使用<code>if let/guard let/case let</code>配合<code>as?</code>来处理可选型。</p><h4 id="3-多使用struct和enum,少使用class"><a href="#3-多使用struct和enum,少使用class" class="headerlink" title="3. 多使用struct和enum,少使用class"></a>3. 多使用struct和enum,少使用class</h4><h4 id="4-多用Swift标准库类型,少用对应的Foundation类型"><a href="#4-多用Swift标准库类型,少用对应的Foundation类型" class="headerlink" title="4. 多用Swift标准库类型,少用对应的Foundation类型"></a>4. 多用Swift标准库类型,少用对应的Foundation类型</h4><p>前者是 struct,后者是 class。</p><h4 id="5-优先使用内置的高阶函数"><a href="#5-优先使用内置的高阶函数" class="headerlink" title="5. 优先使用内置的高阶函数"></a>5. 优先使用内置的高阶函数</h4><h4 id="6-使用try-catch处理异常"><a href="#6-使用try-catch处理异常" class="headerlink" title="6. 使用try catch处理异常"></a>6. 使用try catch处理异常</h4><p>这种方式可以在出现异常时明确知道具体的信息,而 try? 和 try! 无法做到。</p><h4 id="7-对String判空时优先采用isEmpty"><a href="#7-对String判空时优先采用isEmpty" class="headerlink" title="7. 对String判空时优先采用isEmpty"></a>7. 对String判空时优先采用isEmpty</h4><p><code>String</code>的<code>index</code>和<code>count</code>不是一一对应的(兼容 Unicode),所以<code>string.count == 0</code>的效率不如<code>string.isEmpty</code>。</p><h4 id="8-文件名字去掉前缀"><a href="#8-文件名字去掉前缀" class="headerlink" title="8. 文件名字去掉前缀"></a>8. 文件名字去掉前缀</h4><p>Swift 有命名空间,不用担心重复命名问题。</p><h4 id="9-省略self"><a href="#9-省略self" class="headerlink" title="9. 省略self"></a>9. 省略self</h4><p>只在闭包内、函数实参和成员变量名字相同和方法形参需要自身时使用。闭包内<code>self</code>是强制的,并且可以提醒注意循环引用问题。函数调用时实参名和成员变量相同时,函数作用域内会优先使用函数实参,所以访问成员变量是需要<code>self</code>。</p><h4 id="10-省略init"><a href="#10-省略init" class="headerlink" title="10. 省略init()"></a>10. 省略init()</h4><p>直接使用<code>ClassA()</code>,代替<code>ClassA.init()</code>,代码更简洁。</p><h4 id="11-使用默认形参,简化接口设计"><a href="#11-使用默认形参,简化接口设计" class="headerlink" title="11. 使用默认形参,简化接口设计"></a>11. 使用默认形参,简化接口设计</h4><p>在设计接口时,不再需要为每一个形参是否需要而编写一个方法了,从而减少方法数。</p><h4 id="12-使用-接收不使用的返回值"><a href="#12-使用-接收不使用的返回值" class="headerlink" title="12. 使用_接收不使用的返回值"></a>12. 使用_接收不使用的返回值</h4><h4 id="13-使用any-of-替代多个"><a href="#13-使用any-of-替代多个" class="headerlink" title="13. 使用any(of:)替代多个||"></a>13. 使用any(of:)替代多个||</h4><figure class="highlight swift"><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><code class="hljs swift"><span class="hljs-comment">// 一般</span><br><span class="hljs-keyword">if</span> string <span class="hljs-operator">==</span> <span class="hljs-string">"One"</span> <span class="hljs-operator">||</span> string <span class="hljs-operator">==</span> <span class="hljs-string">"Two"</span> <span class="hljs-operator">||</span> string <span class="hljs-operator">==</span> <span class="hljs-string">"Three"</span> {<br>}<br><span class="hljs-comment">// 更好</span><br><span class="hljs-keyword">if</span> string <span class="hljs-operator">==</span> <span class="hljs-built_in">any</span>(of: <span class="hljs-string">"One"</span>, <span class="hljs-string">"Two"</span>, <span class="hljs-string">"Three"</span>) {<br>}<br></code></pre></td></tr></table></figure><h4 id="14-使用-96-96-来定义和关键字重名的方法和属性"><a href="#14-使用-96-96-来定义和关键字重名的方法和属性" class="headerlink" title="14. 使用``来定义和关键字重名的方法和属性"></a>14. 使用``来定义和关键字重名的方法和属性</h4><figure class="highlight swift"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs swift"><span class="hljs-keyword">let</span> `default` <span class="hljs-operator">=</span> <span class="hljs-type">A</span>()<br><span class="hljs-keyword">func</span> <span class="hljs-title function_">`default`</span>() {}<br></code></pre></td></tr></table></figure><h4 id="15-正确处理Strong-Weak-Dance"><a href="#15-正确处理Strong-Weak-Dance" class="headerlink" title="15. 正确处理Strong-Weak Dance"></a>15. 正确处理Strong-Weak Dance</h4><p>Swift 在闭包中可以使用<code>weak</code>和<code>unowned</code>指定闭包对值的捕获,配合<code>guard</code>很容易解决<code>Strong-Weak Dance</code>问题。</p><figure class="highlight swift"><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><code class="hljs swift">test { [<span class="hljs-keyword">weak</span> <span class="hljs-keyword">self</span>] <span class="hljs-keyword">in</span><br> <span class="hljs-keyword">guard</span> <span class="hljs-keyword">let</span> <span class="hljs-keyword">self</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">self</span> <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> }<br> <span class="hljs-comment">// 接下来使用self不会产生循环引用的问题</span><br>}<br></code></pre></td></tr></table></figure><h4 id="16-使用闭包进行初始化"><a href="#16-使用闭包进行初始化" class="headerlink" title="16. 使用闭包进行初始化"></a>16. 使用闭包进行初始化</h4><p>初始化一个对象时还需要设置其中的一些属性,此时建议使用闭包进行初始化。</p><figure class="highlight swift"><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></pre></td><td class="code"><pre><code class="hljs swift"><span class="hljs-keyword">lazy</span> <span class="hljs-keyword">var</span> label: <span class="hljs-type">UILabel</span> <span class="hljs-operator">=</span> {<br> <span class="hljs-keyword">let</span> label <span class="hljs-operator">=</span> <span class="hljs-type">UILabel</span>(frame: <span class="hljs-type">CGRect</span>(x: <span class="hljs-number">0</span>, y: <span class="hljs-number">0</span>, width: <span class="hljs-number">100</span>, height: <span class="hljs-number">30</span>))<br> label.text <span class="hljs-operator">=</span> <span class="hljs-string">"文字"</span><br> label.textColor <span class="hljs-operator">=</span> .red<br> label.numberOfLines <span class="hljs-operator">=</span> <span class="hljs-number">0</span><br> label.textAlignment <span class="hljs-operator">=</span> .center<br> <span class="hljs-keyword">return</span> label<br>}()<br></code></pre></td></tr></table></figure><h4 id="17-合理使用形式参数名与形式参数标签"><a href="#17-合理使用形式参数名与形式参数标签" class="headerlink" title="17. 合理使用形式参数名与形式参数标签"></a>17. 合理使用形式参数名与形式参数标签</h4><p>可以在调用和编写的时候都有更合适简洁的表达。</p><figure class="highlight swift"><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><code class="hljs swift"><span class="hljs-comment">// 一般</span><br><span class="hljs-keyword">func</span> <span class="hljs-title function_">updateWithView</span>(<span class="hljs-params">view</span>: <span class="hljs-type">UIView</span>)<br>updateWithView(view: viewA)<br><span class="hljs-comment">// 更好</span><br><span class="hljs-keyword">func</span> <span class="hljs-title function_">updateWithView</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">view</span>: <span class="hljs-type">UIView</span>)<br>updateWithView(viewA)<br><br><span class="hljs-comment">// 一般</span><br><span class="hljs-keyword">func</span> <span class="hljs-title function_">didSelectAtIndex</span>(<span class="hljs-params">index</span>: <span class="hljs-type">Int</span>)<br>didSelectAtIndex(index: <span class="hljs-number">2</span>)<br><span class="hljs-comment">// 更好</span><br><span class="hljs-keyword">func</span> <span class="hljs-title function_">didSelect</span>(<span class="hljs-params">at</span> <span class="hljs-params">index</span>: <span class="hljs-type">Int</span>)<br>didSelect(at: <span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure><h4 id="18-enum用于命名空间声明"><a href="#18-enum用于命名空间声明" class="headerlink" title="18. enum用于命名空间声明"></a>18. enum用于命名空间声明</h4><p>定义常量时,用命名空间做隔离是最好的,Swift 的<code>enum</code>比较适合用于命名空间的定义。</p><figure class="highlight swift"><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></pre></td><td class="code"><pre><code class="hljs swift"><span class="hljs-keyword">enum</span> <span class="hljs-title class_">Event</span> {<br> <span class="hljs-keyword">enum</span> <span class="hljs-title class_">Name</span> {<br> <span class="hljs-keyword">static</span> <span class="hljs-keyword">let</span> login <span class="hljs-operator">=</span> <span class="hljs-string">"event.name.login"</span><br> }<br>}<br><br><span class="hljs-comment">// 使用</span><br><span class="hljs-type">Event</span>.<span class="hljs-type">Name</span>.login<br></code></pre></td></tr></table></figure><h4 id="19-使用-返回默认值"><a href="#19-使用-返回默认值" class="headerlink" title="19. 使用??返回默认值"></a>19. 使用??返回默认值</h4><figure class="highlight swift"><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><code class="hljs swift"><span class="hljs-comment">// 一般</span><br><span class="hljs-keyword">var</span> name: <span class="hljs-type">String</span>?<br><span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> aName <span class="hljs-operator">=</span> dic[<span class="hljs-string">"name"</span>] <span class="hljs-keyword">as?</span> <span class="hljs-type">String</span> {<br> name <span class="hljs-operator">=</span> aName<br>} <span class="hljs-keyword">else</span> {<br> name <span class="hljs-operator">=</span> <span class="hljs-string">""</span><br>}<br><br><span class="hljs-comment">// 更好</span><br><span class="hljs-keyword">let</span> name <span class="hljs-operator">=</span> dic[<span class="hljs-string">"name"</span>] <span class="hljs-keyword">as?</span> <span class="hljs-type">String</span> <span class="hljs-operator">??</span> <span class="hljs-string">""</span><br></code></pre></td></tr></table></figure><h4 id="20-优先使用guard"><a href="#20-优先使用guard" class="headerlink" title="20. 优先使用guard"></a>20. 优先使用guard</h4><p><code>guard</code>是<code>if</code>的反义词,可以提前将异常情况<code>return</code>。</p><h4 id="21-集合类型、枚举、结构体、类与协议多使用泛型"><a href="#21-集合类型、枚举、结构体、类与协议多使用泛型" class="headerlink" title="21. 集合类型、枚举、结构体、类与协议多使用泛型"></a>21. 集合类型、枚举、结构体、类与协议多使用泛型</h4><h4 id="22-多使用Result类型"><a href="#22-多使用Result类型" class="headerlink" title="22. 多使用Result类型"></a>22. 多使用Result类型</h4><h4 id="23-使用Codable进行JSON转模型"><a href="#23-使用Codable进行JSON转模型" class="headerlink" title="23. 使用Codable进行JSON转模型"></a>23. 使用Codable进行JSON转模型</h4><h4 id="24-使用SwiftUI与Combine"><a href="#24-使用SwiftUI与Combine" class="headerlink" title="24. 使用SwiftUI与Combine"></a>24. 使用SwiftUI与Combine</h4><h4 id="25-使用Concurrency"><a href="#25-使用Concurrency" class="headerlink" title="25. 使用Concurrency"></a>25. 使用Concurrency</h4>]]></content>
</entry>
</search>