Destructuring
Nếu bạn từng code javascript, hẳn bạn sẽ không còn lạ gì với cú pháp destructuring – một cú pháp rất thanh lịch để “đập hộp” và lấy giá trị ra khỏi object. Ngắn gọn, sạch đẹp, trông giống như này:
1 2 3 4 5 6 | <span class="token keyword">let</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span> a<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> b<span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> a<span class="token punctuation">,</span> b <span class="token punctuation">}</span> <span class="token operator">=</span> obj<span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1 2</span> |
Trong Swift chúng ta cũng có một cú pháp tương tự, nhưng là sử dụng với tuples. Giả sử có 1 tuple như sau:
1 2 | <span class="token keyword">let</span> data <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">"one"</span><span class="token punctuation">,</span> <span class="token string">"two"</span><span class="token punctuation">,</span> <span class="token string">"three"</span><span class="token punctuation">)</span> |
Nếu như bạn muốn lấy 3 giá trị trong tuple này để gán cho 3 biến theo cách thông thường thì chắc bạn sẽ viết gần giống thế này:
1 2 3 4 | <span class="token keyword">let</span> one <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token number">0</span> <span class="token keyword">let</span> two <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token number">1</span> <span class="token keyword">let</span> three <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token number">2</span> |
Nhưng nếu sử dụng cú pháp destructuring, bạn chỉ cần viết:
1 2 | <span class="token keyword">let</span> <span class="token punctuation">(</span>one<span class="token punctuation">,</span> two<span class="token punctuation">,</span> three<span class="token punctuation">)</span> <span class="token operator">=</span> data |
Ngắn gọn và cool ngầu hơn nhiều phải không?
Destructuring trong Swift thường được sử dụng với 3 mục đích chính: Lấy giá trị ra khỏi tuples, gán giá trị cho nhiều biến cùng lúc, và hoán đổi các giá trị với nhau.
Lấy giá trị ra khỏi tuples
Trong ví dụ bên trên bạn đã thấy destructuring được sử dụng vì mục đích này rồi, nhưng kĩ thuật này sẽ đặc biệt có ích khi bạn làm việc với function mà return nhiều giá trị cùng một lúc. Ví dụ như hàm này:
1 2 3 4 | <span class="token keyword">func</span> <span class="token function">getPerson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token builtin">String</span><span class="token punctuation">,</span> <span class="token builtin">Int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token string">"Taylor Swift"</span><span class="token punctuation">,</span> <span class="token number">26</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Hàm trên trả về cả tên và tuổi. Thường thì bạn sẽ muốn gán 2 giá trị này vào 2 biến khác nhau để sử dụng cho linh hoạt. Nếu không sử dụng destructuring thì chúng ta lại phải gõ khá lê thê:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">func</span> <span class="token function">getPerson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token builtin">String</span><span class="token punctuation">,</span> <span class="token builtin">Int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token string">"Taylor Swift"</span><span class="token punctuation">,</span> <span class="token number">26</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token function">getPerson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> name <span class="token operator">=</span> person<span class="token punctuation">.</span><span class="token number">1</span> <span class="token keyword">let</span> age <span class="token operator">=</span> person<span class="token punctuation">.</span><span class="token number">2</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span> is <span class="token interpolation"><span class="token delimiter variable">(</span>age<span class="token delimiter variable">)</span></span> years old"</span><span class="token punctuation">)</span> <span class="token comment">// Taylor Swift is 26 years old</span> |
Còn dùng destructuring thì chỉ cần:
1 2 3 4 | <span class="token keyword">let</span> <span class="token punctuation">(</span>name<span class="token punctuation">,</span> age<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">getPerson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span> is <span class="token interpolation"><span class="token delimiter variable">(</span>age<span class="token delimiter variable">)</span></span> years old"</span><span class="token punctuation">)</span> <span class="token comment">// Taylor Swift is 26 years old</span> |
Trường hợp bạn không cần sử dụng 1 giá trị nào đó, bạn có thể sử dụng kí hiệu _ để bỏ qua giá trị đó, giống như thế này:
1 2 3 4 | <span class="token keyword">let</span> <span class="token punctuation">(</span><span class="token number">_</span><span class="token punctuation">,</span> age<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">getPerson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"That person is <span class="token interpolation"><span class="token delimiter variable">(</span>age<span class="token delimiter variable">)</span></span> years old"</span><span class="token punctuation">)</span> <span class="token comment">// That person is 26 years old</span> |
Gán giá trị cho nhiều biến cùng lúc
Tiếp theo, bạn có thể sử dụng kĩ thuật này để gán giá trị cho nhiều biến cùng lúc. Các giá trị này có thể là fix cứng, hoặc có thể là return value của 1 function nào đó:
1 2 3 | <span class="token keyword">let</span> <span class="token punctuation">(</span>captain<span class="token punctuation">,</span> chef<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">"Janeway"</span><span class="token punctuation">,</span> <span class="token string">"Neelix"</span><span class="token punctuation">)</span> <span class="token keyword">let</span> <span class="token punctuation">(</span>engineer<span class="token punctuation">,</span> pilot<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token function">getEngineer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">getPilot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
Dùng kĩ thuật này với các giá trị có liên quan chặt chẽ với nhau, chẳng hạn như toạ độ trên bản đồ, sẽ rất có lợi cho việc đọc hiểu code.
Hoán đổi các giá trị với nhau
Giả sử có 2 biến Int, a và b, giờ bạn làm thế nào để hoán đổi giá trị của 2 biến này với nhau mà không sử dụng biến thứ 3?
Trong hầu hết các ngôn ngữ chắc bạn sẽ làm thế này:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">var</span> a <span class="token operator">=</span> <span class="token number">10</span> <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token number">20</span> a <span class="token operator">=</span> a <span class="token operator">+</span> b b <span class="token operator">=</span> a <span class="token operator">-</span> b a <span class="token operator">=</span> a <span class="token operator">-</span> b <span class="token function">print</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token function">print</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token comment">// 20 10</span> |
Còn với Swift, bạn có thể dùng destructuring để làm thế này:
1 2 | <span class="token punctuation">(</span>b<span class="token punctuation">,</span> a<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> |
Vẫn chỉ cần một dòng duy nhất.
Như các bạn thấy, việc sử dụng cú pháp destructuring không chỉ giúp bạn tiết kiệm dòng code, mà còn giúp code của bạn dễ đọc, dễ hiểu và trông cool ngầu hơn nữa
Hi vọng bài viết của mình sẽ giúp các bạn có thêm 1 công cụ hữu ích khi code Swift