Bài viết này sẽ giới thiệu cho bạn một vài extension rất hữu ích trong quá trình làm việc của bạn.
Hãy đưa các đoạn code này vào project của bạn và thử nghiệm
1. UIColor
Nếu như bạn muốn sử dụng màu dạng mã hex để khởi tạo UIColor chưa ? Đoạn code dưới đây sẽ giúp bạn làm điều đó dễ dàng hơn:
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 | <span class="token keyword">extension</span> <span class="token builtin">UIColor</span> <span class="token punctuation">{</span> <span class="token keyword">convenience</span> <span class="token keyword">init</span><span class="token operator">?</span><span class="token punctuation">(</span>hex<span class="token punctuation">:</span> <span class="token builtin">String</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> hexSanitized <span class="token operator">=</span> hex<span class="token punctuation">.</span><span class="token function">trimmingCharacters</span><span class="token punctuation">(</span><span class="token keyword">in</span><span class="token punctuation">:</span> <span class="token punctuation">.</span>whitespacesAndNewlines<span class="token punctuation">)</span> hexSanitized <span class="token operator">=</span> hexSanitized<span class="token punctuation">.</span><span class="token function">replacingOccurrences</span><span class="token punctuation">(</span>of<span class="token punctuation">:</span> <span class="token string">"#"</span><span class="token punctuation">,</span> with<span class="token punctuation">:</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token keyword">var</span> rgb<span class="token punctuation">:</span> <span class="token builtin">UInt64</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token keyword">var</span> r<span class="token punctuation">:</span> <span class="token builtin">CGFloat</span> <span class="token operator">=</span> <span class="token number">0.0</span> <span class="token keyword">var</span> g<span class="token punctuation">:</span> <span class="token builtin">CGFloat</span> <span class="token operator">=</span> <span class="token number">0.0</span> <span class="token keyword">var</span> b<span class="token punctuation">:</span> <span class="token builtin">CGFloat</span> <span class="token operator">=</span> <span class="token number">0.0</span> <span class="token keyword">var</span> a<span class="token punctuation">:</span> <span class="token builtin">CGFloat</span> <span class="token operator">=</span> <span class="token number">1.0</span> <span class="token keyword">let</span> length <span class="token operator">=</span> hexSanitized<span class="token punctuation">.</span><span class="token builtin">count</span> <span class="token keyword">guard</span> <span class="token function">Scanner</span><span class="token punctuation">(</span>string<span class="token punctuation">:</span> hexSanitized<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">scanHexInt64</span><span class="token punctuation">(</span><span class="token operator">&</span>rgb<span class="token punctuation">)</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">nil</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> length <span class="token operator">==</span> <span class="token number">6</span> <span class="token punctuation">{</span> r <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0xFF0000</span><span class="token punctuation">)</span> <span class="token operator">></span><span class="token operator">></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> g <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0x00FF00</span><span class="token punctuation">)</span> <span class="token operator">></span><span class="token operator">></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> b <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0x0000FF</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> length <span class="token operator">==</span> <span class="token number">8</span> <span class="token punctuation">{</span> r <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0xFF000000</span><span class="token punctuation">)</span> <span class="token operator">></span><span class="token operator">></span> <span class="token number">24</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> g <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0x00FF0000</span><span class="token punctuation">)</span> <span class="token operator">></span><span class="token operator">></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> b <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0x0000FF00</span><span class="token punctuation">)</span> <span class="token operator">></span><span class="token operator">></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> a <span class="token operator">=</span> <span class="token function">CGFloat</span><span class="token punctuation">(</span>rgb <span class="token operator">&</span> <span class="token number">0x000000FF</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">nil</span> <span class="token punctuation">}</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token keyword">init</span><span class="token punctuation">(</span>red<span class="token punctuation">:</span> r<span class="token punctuation">,</span> green<span class="token punctuation">:</span> g<span class="token punctuation">,</span> blue<span class="token punctuation">:</span> b<span class="token punctuation">,</span> alpha<span class="token punctuation">:</span> a<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Và đây là kết quả mà bạn mong muốn
2. UISearchBar
Có khi nào bạn cần sử dụng đến textField trong Search bar chưa ?
Với iOS 13 thì bạn có thể dễ dàng làm việc này bằng cách
1 2 | <span class="token function">print</span><span class="token punctuation">(</span>searchBar<span class="token punctuation">.</span>searchTextField<span class="token punctuation">)</span> |
Tuy nhiên, nếu bạn sử dụng các iOS thấp hơn, ứng dụng sẽ bị crash. Chúng ta cần làm như sau :
1 2 3 4 5 6 | <span class="token keyword">for</span> view<span class="token punctuation">:</span> <span class="token builtin">UIView</span> <span class="token keyword">in</span> <span class="token punctuation">(</span>searchBar<span class="token punctuation">.</span>subviews<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>subviews <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token keyword">let</span> textField <span class="token operator">=</span> view <span class="token keyword">as</span><span class="token operator">?</span> <span class="token builtin">UITextField</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> textField <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Để dễ dàng cho việc sử dụng thì hãy tạo một extension cho UISearchBar như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">extension</span> <span class="token builtin">UISearchBar</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> textField <span class="token punctuation">:</span> <span class="token builtin">UITextField</span><span class="token operator">?</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> #<span class="token function">available</span><span class="token punctuation">(</span>iOS <span class="token number">13.0</span><span class="token punctuation">,</span> <span class="token operator">*</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">self</span><span class="token punctuation">.</span>searchTextField <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// Fallback on earlier versions</span> <span class="token keyword">for</span> view<span class="token punctuation">:</span> <span class="token builtin">UIView</span> <span class="token keyword">in</span> <span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">.</span>subviews<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>subviews <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token keyword">let</span> textField <span class="token operator">=</span> view <span class="token keyword">as</span><span class="token operator">?</span> <span class="token builtin">UITextField</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> textField <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant">nil</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
và bây giờ bạn dễ dàng có thể truy cập vào TextField của UISearchBar
3. UIImage
Đôi khi bạn muốn hiển thị placeholder cho UIImageView, nhưng bạn cần cung cấp một giá trị cụ thể cho nó.
Chúng ta có thể tạo một UIimage từ 1 màu sắc cụ thể
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">extension</span> <span class="token builtin">UIImage</span> <span class="token punctuation">{</span> <span class="token keyword">convenience</span> <span class="token keyword">init</span><span class="token operator">?</span><span class="token punctuation">(</span>color<span class="token punctuation">:</span> <span class="token builtin">UIColor</span><span class="token punctuation">,</span> size<span class="token punctuation">:</span> <span class="token builtin">CGSize</span> <span class="token operator">=</span> <span class="token function">CGSize</span><span class="token punctuation">(</span>width<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> height<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> rect <span class="token operator">=</span> <span class="token function">CGRect</span><span class="token punctuation">(</span>origin<span class="token punctuation">:</span> <span class="token punctuation">.</span>zero<span class="token punctuation">,</span> size<span class="token punctuation">:</span> size<span class="token punctuation">)</span> <span class="token function">UIGraphicsBeginImageContextWithOptions</span><span class="token punctuation">(</span>rect<span class="token punctuation">.</span>size<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token number">0.0</span><span class="token punctuation">)</span> color<span class="token punctuation">.</span><span class="token function">setFill</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">UIRectFill</span><span class="token punctuation">(</span>rect<span class="token punctuation">)</span> <span class="token keyword">let</span> image <span class="token operator">=</span> <span class="token function">UIGraphicsGetImageFromCurrentImageContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">UIGraphicsEndImageContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">guard</span> <span class="token keyword">let</span> cgImage <span class="token operator">=</span> image<span class="token operator">?</span><span class="token punctuation">.</span>cgImage <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">nil</span> <span class="token punctuation">}</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token keyword">init</span><span class="token punctuation">(</span>cgImage<span class="token punctuation">:</span> cgImage<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Điều này cho phép bạn khởi tạo 1 UIImage từ 1 màu cụ thể
4. Numeric
Nhiều khi chúng ta cần hiển thị giá trong ứng dụng của mình. Nhưng giá không có khoảng cách thì sẽ không đẹp chút nào, chúng ta nên thêm các phân cách giữa hàng nghìn với nhau.
Đoạn code sau sẽ giúp bạn làm điều đó một cách đơn giản:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">extension</span> <span class="token builtin">Numeric</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> formattedWithSeparator<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> formatter<span class="token punctuation">.</span>groupingSeparator <span class="token operator">=</span> <span class="token string">" "</span> formatter<span class="token punctuation">.</span>numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span>decimal <span class="token keyword">return</span> formatter<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token keyword">for</span><span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token function">String</span><span class="token punctuation">(</span>describing<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Hãy xem kết quả
5. UITableViewCell and UICollectionViewCell
Khi làm việc với TableView hay CollectionView thì bạn sẽ thường viết đoạn code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">let</span> cellId <span class="token operator">=</span> <span class="token string">"CellIdentifier"</span> <span class="token keyword">let</span> tableView<span class="token punctuation">:</span> <span class="token builtin">UITableView</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> tableView <span class="token operator">=</span> <span class="token function">UITableView</span><span class="token punctuation">(</span><span class="token punctuation">)</span> tableView<span class="token punctuation">.</span><span class="token function">register</span><span class="token punctuation">(</span><span class="token builtin">UITableViewCell</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">,</span> forCellReuseIdentifier<span class="token punctuation">:</span> cellId<span class="token punctuation">)</span> tableView<span class="token punctuation">.</span>dataSource <span class="token operator">=</span> <span class="token keyword">self</span> <span class="token keyword">return</span> tableView <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">tableView</span><span class="token punctuation">(</span><span class="token number">_</span> tableView<span class="token punctuation">:</span> <span class="token builtin">UITableView</span><span class="token punctuation">,</span> cellForRowAt indexPath<span class="token punctuation">:</span> <span class="token builtin">IndexPath</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">UITableViewCell</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> cell <span class="token operator">=</span> tableView<span class="token punctuation">.</span><span class="token function">dequeueReusableCell</span><span class="token punctuation">(</span>withIdentifier<span class="token punctuation">:</span> cellId<span class="token punctuation">)</span><span class="token operator">!</span> <span class="token keyword">return</span> cell <span class="token punctuation">}</span> |
Bạn có thể thấy là chúng ta cần khởi tạo 1 thuộc tính là cellId. Nhưng làm thế nào có thể làm cho code này trở nên ngắn gọn hơn. Hãy tham khảo extension dưới đây
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">protocol</span> <span class="token builtin">ReuseIdentifiable</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token keyword">func</span> <span class="token function">reuseIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">String</span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">ReuseIdentifiable</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token keyword">func</span> <span class="token function">reuseIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">String</span><span class="token punctuation">(</span>describing<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">UITableViewCell</span><span class="token punctuation">:</span> <span class="token builtin">ReuseIdentifiable</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">UICollectionViewCell</span><span class="token punctuation">:</span> <span class="token builtin">ReuseIdentifiable</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
Giờ đây bạn có thể sử dụng reuseIdentifier để định nghĩa các cell
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">let</span> tableView<span class="token punctuation">:</span> <span class="token builtin">UITableView</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> tableView <span class="token operator">=</span> <span class="token function">UITableView</span><span class="token punctuation">(</span><span class="token punctuation">)</span> tableView<span class="token punctuation">.</span><span class="token function">register</span><span class="token punctuation">(</span><span class="token builtin">UITableViewCell</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">,</span> forCellReuseIdentifier<span class="token punctuation">:</span> <span class="token builtin">UITableViewCell</span><span class="token punctuation">.</span><span class="token function">reuseIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> tableView<span class="token punctuation">.</span>dataSource <span class="token operator">=</span> <span class="token keyword">self</span> <span class="token keyword">return</span> tableView <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">tableView</span><span class="token punctuation">(</span><span class="token number">_</span> tableView<span class="token punctuation">:</span> <span class="token builtin">UITableView</span><span class="token punctuation">,</span> cellForRowAt indexPath<span class="token punctuation">:</span> <span class="token builtin">IndexPath</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">UITableViewCell</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> cell <span class="token operator">=</span> tableView<span class="token punctuation">.</span><span class="token function">dequeueReusableCell</span><span class="token punctuation">(</span>withIdentifier<span class="token punctuation">:</span> <span class="token builtin">UITableViewCell</span><span class="token punctuation">.</span><span class="token function">reuseIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">!</span> <span class="token keyword">return</span> cell <span class="token punctuation">}</span> |
Mong rằng bài viết sẽ giúp ích cho bạn trong quá trình code.
Nguồn tham khảo:
https://medium.com/better-programming/5-useful-swift-extensions-to-use-in-your-ios-app-f54a817ea9a9