<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Thanh Nguyen, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/nguyenthanh/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/nguyenthanh/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Thu, 21 Dec 2023 02:02:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Thanh Nguyen, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/nguyenthanh/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Custom View Modifiers trong SwiftUI</title>
		<link>https://blog.tomosia.com.vn/custom-view-modifiers-trong-swiftui/</link>
					<comments>https://blog.tomosia.com.vn/custom-view-modifiers-trong-swiftui/#comments</comments>
		
		<dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
		<pubDate>Thu, 21 Dec 2023 02:02:30 +0000</pubDate>
				<category><![CDATA[IOS]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[swiftui]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2616</guid>

					<description><![CDATA[<p>What are “View Modifiers”? Trong SwiftUI, view modifiers là một cách để thay đổi hoặc thiết lập hành&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/custom-view-modifiers-trong-swiftui/">Custom View Modifiers trong SwiftUI</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading has-cyan-bluish-gray-color has-text-color has-link-color wp-elements-141539c128789e447cbcf37c3824adf3" id="4988"><span id="what-are-view-modifiers">What are “View Modifiers”?</span></h5>



<pre class="wp-block-preformatted">Trong SwiftUI, view modifiers là một cách để thay đổi hoặc thiết lập hành vi cho một view cụ thể. Chúng là các cấu trúc nhẹ nhàng cho phép bạn thay đổi giao diện, hành vi hoặc bố cục của một view. Các bộ điều chỉnh view được áp dụng bằng cách sử dụng cú pháp dấu chấm và có thể được nối với nhau để thực hiện những sửa đổi phức tạp hơn.

View modifiers không chỉ cho phép bạn thay đổi hình dạng và hành vi của một view, mà còn cho phép bạn tạo ra những thay đổi phức tạp bằng cách nối chúng lại với nhau. Với SwiftUI, bạn có thể thay đổi font, màu sắc, khoảng trống, căn chỉnh, và nhiều tính năng khác của view chỉ bằng cú pháp đơn giản.

Ngoài ra, SwiftUI cung cấp các view modifier tích hợp sẵn, giúp bạn tiết kiệm thời gian và công sức trong việc tạo ra giao diện người dùng đẹp và hiệu quả. Hơn nữa, bạn cũng có thể tạo ra những bộ điều chỉnh tùy chỉnh phù hợp với yêu cầu cụ thể của ứng dụng của mình.
</pre>



<p>Trong SwiftUI, view modifiers là một cách hữu dụng để có thể đóng gói và tái sử dụng các hành vi và styles cho các view. </p>



<p>Bạn có thể làm điều này bằng cách tạo một struct <strong>ViewModifier</strong> mới với giao thức <strong>ViewModifier</strong>. Ở đây, mình tạo một struct <strong>CustomViewModifier</strong> và tuân thủ nó vào giao thức <strong>ViewModifier</strong>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="struct CustomViewModifier: ViewModifier {

    func body(content: Content) -&gt; some View {
        content
    }

}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CustomViewModifier</span><span style="color: #F6F6F4">: ViewModifier {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">body</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">content</span><span style="color: #F6F6F4">: Content) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        content</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Bây giờ, bạn có thể thêm các modifier vào content này theo ý muốn. Mình sẽ thêm một số view modifier tích hợp sẵn để thêm border.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="struct CustomViewModifier: ViewModifier {

    func body(content: Content) -&gt; some View {
        content
            .padding()
            .cornerRadius(10)
            .overlay(
                RoundedRectangle(cornerRadius: 10)
                    .stroke(Color.black, lineWidth: 2)
            )
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CustomViewModifier</span><span style="color: #F6F6F4">: ViewModifier {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">body</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">content</span><span style="color: #F6F6F4">: Content) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        content</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">overlay</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">RoundedRectangle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">stroke</span><span style="color: #F6F6F4">(Color.black, </span><span style="color: #97E1F1">lineWidth</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">            )</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Chúng ta có thể tùy chỉnh các thuộc tính của bộ điều chỉnh view như corner radius, border width, v.v. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="struct CustomViewModifier: ViewModifier {
    
    var cornerRadius: CGFloat
    var borderColor: Color
    var borderWidth: CGFloat

    func body(content: Content) -&gt; some View {
        content
            .padding()
            .cornerRadius(cornerRadius)
            .overlay(
                RoundedRectangle(cornerRadius: cornerRadius)
                    .stroke(borderColor, lineWidth: borderWidth)
            )
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CustomViewModifier</span><span style="color: #F6F6F4">: ViewModifier {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> cornerRadius: CGFloat</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> borderColor: Color</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> borderWidth: CGFloat</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">body</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">content</span><span style="color: #F6F6F4">: Content) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        content</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">(cornerRadius)</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">overlay</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">RoundedRectangle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: cornerRadius)</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">stroke</span><span style="color: #F6F6F4">(borderColor, </span><span style="color: #97E1F1">lineWidth</span><span style="color: #F6F6F4">: borderWidth)</span></span>
<span class="line"><span style="color: #F6F6F4">            )</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Chúng ta có thể gọi trực tiếp custom modifier này hoặc bạn có thể đặt một tên cho nó bằng cách tạo extension từ <strong>View</strong>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code=".modifier(CustomViewModifier(cornerRadius: 10, 
                             borderColor: .black, 
                             borderWidth: 2)) " style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">modifier</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">CustomViewModifier</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">, </span></span>
<span class="line"><span style="color: #F6F6F4">                             </span><span style="color: #97E1F1">borderColor</span><span style="color: #F6F6F4">: .black, </span></span>
<span class="line"><span style="color: #F6F6F4">                             </span><span style="color: #97E1F1">borderWidth</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">)) </span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="extension View{
    //--Chúng ta có thể đặt tên cho custom modifer
    func addBorder(cornerRadius: CGFloat, 
                   borderColor: Color,
                   borderWidth: CGFloat) -&gt; some View{
        self.modifier(CustomViewModifier(cornerRadius: cornerRadius, 
                                         borderColor: borderColor,
                                         borderWidth: borderWidth))
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">extension</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">View</span><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">//--Chúng ta có thể đặt tên cho custom modifer</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">addBorder</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">cornerRadius</span><span style="color: #F6F6F4">: CGFloat, </span></span>
<span class="line"><span style="color: #F6F6F4">                   </span><span style="color: #62E884; font-style: italic">borderColor</span><span style="color: #F6F6F4">: Color,</span></span>
<span class="line"><span style="color: #F6F6F4">                   </span><span style="color: #62E884; font-style: italic">borderWidth</span><span style="color: #F6F6F4">: CGFloat) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">self</span><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">modifier</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">CustomViewModifier</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: cornerRadius, </span></span>
<span class="line"><span style="color: #F6F6F4">                                         </span><span style="color: #97E1F1">borderColor</span><span style="color: #F6F6F4">: borderColor,</span></span>
<span class="line"><span style="color: #F6F6F4">                                         </span><span style="color: #97E1F1">borderWidth</span><span style="color: #F6F6F4">: borderWidth))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Bây giờ hãy sử dụng modifier này trong view của bạn.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="struct ContentView: View {
    var body: some View {
        VStack {
            Text(&quot;Hello, world!&quot;)
                .addBorder(cornerRadius: 8, 
                           borderColor: Color.blue, 
                           borderWidth: 2)
        }
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        VStack {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">Text</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Hello, world!</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">addBorder</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">8</span><span style="color: #F6F6F4">, </span></span>
<span class="line"><span style="color: #F6F6F4">                           </span><span style="color: #97E1F1">borderColor</span><span style="color: #F6F6F4">: Color.blue, </span></span>
<span class="line"><span style="color: #F6F6F4">                           </span><span style="color: #97E1F1">borderWidth</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Kết quả chúng ta sẽ được như hình bên dưới: </p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="369" height="231" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/1_9-VoC_PsPrFMjSVm3r3aPg-edited.webp" alt="" class="wp-image-2687" style="width:405px;height:auto" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/1_9-VoC_PsPrFMjSVm3r3aPg-edited.webp 369w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/1_9-VoC_PsPrFMjSVm3r3aPg-edited-300x188.webp 300w" sizes="(max-width: 369px) 100vw, 369px" /></figure>
</div>


<p>Thêm một ví dụ custom modifier với Linear Gradient: Tạo một view modifier có background là linear gradient và có thể blur.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Swift</span><span role="button" tabindex="0" data-code="struct BlurWithLinearGradient: ViewModifier {
    let isBlur: Bool
    let cornerRadius: CGFloat
    
    func body(content: Content) -&gt; some View {
        ZStack {
            if isBlur {
                content
                    .background(linearGradient())
                    .blur(radius: 3)
            }

            content
                .background(linearGradient())
        }
    }
    
    @ViewBuilder
    private func linearGradient() -&gt; some View {
        LinearGradient(colors: [Colors.black, Colors.blue],
                       startPoint: .topLeading,
                       endPoint: .bottomTrailing)
            .overlay(
                RoundedRectangle(cornerRadius: cornerRadius)
                    .strokeBorder(.white.opacity(0.5), lineWidth: 1)
            )
            .clipShape(RoundedRectangle(cornerRadius: cornerRadius))
    }
}

extension View {
    func linearGradientBlur(isBlur: Bool = false, 
                            cornerRadius: CGFloat = 15) -&gt; some View {
        self.modifier(BlurWithLinearGradient(isBlur: isBlur, 
                                             cornerRadius: cornerRadius))
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">BlurWithLinearGradient</span><span style="color: #F6F6F4">: ViewModifier {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> isBlur: </span><span style="color: #97E1F1; font-style: italic">Bool</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> cornerRadius: CGFloat</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">body</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">content</span><span style="color: #F6F6F4">: Content) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        ZStack {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> isBlur {</span></span>
<span class="line"><span style="color: #F6F6F4">                content</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">background</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">linearGradient</span><span style="color: #F6F6F4">())</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">blur</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">radius</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            content</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">background</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">linearGradient</span><span style="color: #F6F6F4">())</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">@ViewBuilder</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">linearGradient</span><span style="color: #F6F6F4">() </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">LinearGradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">colors</span><span style="color: #F6F6F4">: [Colors.black, Colors.blue],</span></span>
<span class="line"><span style="color: #F6F6F4">                       </span><span style="color: #97E1F1">startPoint</span><span style="color: #F6F6F4">: .topLeading,</span></span>
<span class="line"><span style="color: #F6F6F4">                       </span><span style="color: #97E1F1">endPoint</span><span style="color: #F6F6F4">: .bottomTrailing)</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">overlay</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">RoundedRectangle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: cornerRadius)</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">strokeBorder</span><span style="color: #F6F6F4">(.white.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">), </span><span style="color: #97E1F1">lineWidth</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">            )</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">clipShape</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">RoundedRectangle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: cornerRadius))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">extension</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">View</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">func</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">linearGradientBlur</span><span style="color: #F6F6F4">(</span><span style="color: #62E884; font-style: italic">isBlur</span><span style="color: #F6F6F4">: </span><span style="color: #97E1F1; font-style: italic">Bool</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">, </span></span>
<span class="line"><span style="color: #F6F6F4">                            </span><span style="color: #62E884; font-style: italic">cornerRadius</span><span style="color: #F6F6F4">: CGFloat </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">15</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">self</span><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">modifier</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">BlurWithLinearGradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">isBlur</span><span style="color: #F6F6F4">: isBlur, </span></span>
<span class="line"><span style="color: #F6F6F4">                                             </span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">: cornerRadius))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="380" height="233" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-18-at-09.57.57.png" alt="" class="wp-image-2689" style="width:358px;height:auto" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-18-at-09.57.57.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-18-at-09.57.57-300x184.png 300w" sizes="(max-width: 380px) 100vw, 380px" /></figure>
</div>


<p><strong>References</strong>: <br><a href="https://developer.apple.com/documentation/swiftui/viewmodifier" target="_blank" rel="noreferrer noopener">https://developer.apple.com/documentation/swiftui/viewmodifier</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/custom-view-modifiers-trong-swiftui/">Custom View Modifiers trong SwiftUI</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/custom-view-modifiers-trong-swiftui/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Có gì HOT trong Swift 5.9 🔥🔥</title>
		<link>https://blog.tomosia.com.vn/co-gi-hot-trong-swift-5-9-%f0%9f%94%a5%f0%9f%94%a5/</link>
					<comments>https://blog.tomosia.com.vn/co-gi-hot-trong-swift-5-9-%f0%9f%94%a5%f0%9f%94%a5/#comments</comments>
		
		<dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
		<pubDate>Tue, 17 Oct 2023 02:40:21 +0000</pubDate>
				<category><![CDATA[IOS]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1130</guid>

					<description><![CDATA[<p>01. Sử dụng if và switch như biểu thức Đến mãi Swift 5.9, thì từ khoá if và&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/co-gi-hot-trong-swift-5-9-%f0%9f%94%a5%f0%9f%94%a5/">Có gì HOT trong Swift 5.9 🔥🔥</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size" id="c3f6"><span id="01-su-dung-if-va-switch-nhu-bieu-thuc">01. Sử dụng <strong>if</strong> và <strong>switch</strong> như biểu thức</span></h2>



<p id="7b61">Đến mãi Swift 5.9, thì từ khoá <strong>if</strong> và <strong>switch</strong> chỉ được sử dụng như các câu lệnh!</p>



<p id="588a">Điều này có nghĩa là không thể gán trực tiếp kết quả của <strong>if</strong> hoặc <strong>switch</strong> vào một biến hoặc truyền nó như một tham số  </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.425323486328125px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="let bullet = 
  isRoot &amp;&amp; (count == 0 || !willExpand) ? &quot;&quot;
    : count == 0    ? &quot;- &quot;
    : maxDepth &lt;= 0 ? &quot;&gt;&quot; : &quot;&lt;&quot;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> bullet </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2">  isRoot </span><span style="color: #FF79C6">&amp;&amp;</span><span style="color: #F8F8F2"> (count </span><span style="color: #FF79C6">==</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">||</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">!</span><span style="color: #F8F8F2">willExpand) </span><span style="color: #FF79C6">?</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2"> count </span><span style="color: #FF79C6">==</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">?</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">- </span><span style="color: #E9F284">&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2"> maxDepth </span><span style="color: #FF79C6">&lt;=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">?</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">&gt;</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">&lt;</span><span style="color: #E9F284">&quot;</span></span></code></pre></div>



<p id="6177">Hiện tại ở Swift 5.9 này, <strong>if</strong>&nbsp;và&nbsp;<strong>switch</strong>&nbsp;có thể được sử dụng như một biểu thức!</p>



<p id="536d">Các biểu thức bậc ba loằng ngoằng nhìn rối mắt bây giờ có thể thay thế bằng điều kiện <strong>if</strong> giúp chúng ta có thể dễ đọc hơn nhiều:  </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.42535400390625px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="let bullet = 
    if isRoot &amp;&amp; (count == 0 || !willExpand) { &quot;&quot; }
    else if count == 0 { &quot;- &quot; }
    else if maxDepth &lt;= 0 { &quot;&gt;&quot; }
    else { &quot;&lt;&quot; }" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> bullet </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> isRoot </span><span style="color: #FF79C6">&amp;&amp;</span><span style="color: #F8F8F2"> (count </span><span style="color: #FF79C6">==</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">||</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">!</span><span style="color: #F8F8F2">willExpand) { </span><span style="color: #E9F284">&quot;&quot;</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> count </span><span style="color: #FF79C6">==</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> { </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">- </span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> maxDepth </span><span style="color: #FF79C6">&lt;=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> { </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">&gt;</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> { </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">&lt;</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2"> }</span></span></code></pre></div>



<p id="6a09">Không những thế, chúng ta có thể sử dụng chức năng mới này với <strong>if let</strong> hoặc <strong>guard let</strong> để unwrap biến optionals: </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.425346374511719px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="let attributedName =
        if let displayName, !displayName.isEmpty {
            AttributedString(markdown: displayName)
        } else {
            &quot;Untitled&quot;
        } " style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> attributedName </span><span style="color: #FF79C6">=</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> displayName, </span><span style="color: #FF79C6">!</span><span style="color: #F8F8F2">displayName.</span><span style="color: #BD93F9">isEmpty</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #8BE9FD">AttributedString</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD">markdown</span><span style="color: #F8F8F2">: displayName)</span></span>
<span class="line"><span style="color: #F8F8F2">        } </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">Untitled</span><span style="color: #E9F284">&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        } </span></span></code></pre></div>



<h2 class="wp-block-heading" id="6d86"><span id="02-parameter-packs">02. Parameter Packs</span></h2>



<p id="770c">Nếu bạn đã từng phải viết những đoạn code cần xử lý nhiều loại generic không xác định, và Swift không trợ cho việc đa dạng generics  </p>



<p id="6b43">Và cách duy nhất bạn có thể làm là triển khai tất cả các generics vào một function:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:16.854156494140625px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="struct Request&lt;Result&gt; { ... }

struct RequestEvalutor {
  func evalute&lt;Result&gt;(_:) -&gt; (Result)
  
  func evalute&lt;R1, R2&gt;(_:,_:) -&gt; (R1, R2)
  
  func evalute&lt;R1, R2, R3&gt;(_:,_:,_:) -&gt; (R1, R2, R3)
  
  func evalute&lt;R1, R2, R3, R4&gt;(_:,_:,_:,_:) -&gt; (R1, R2, R3, R4)
  
  func evalute&lt;R1, R2, R3, R4, R5&gt;(_:,_:,_:,_:,_:) -&gt; (R1, R2, R3, R4, R5)
}

let request = RequestEvalutor()
let result = request.evaluate(r1, r2, r3, r4, r5)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">struct</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Request</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">Result</span><span style="color: #F8F8F2">&gt; { </span><span style="color: #FF79C6">...</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">struct</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">RequestEvalutor</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">evalute</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">Result</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (Result)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">evalute</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">R1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R2</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (R1, R2)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">evalute</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">R1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R3</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (R1, R2, R3)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">evalute</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">R1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R3</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R4</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (R1, R2, R3, R4)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">evalute</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">R1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R3</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">R5</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:,</span><span style="color: #50FA7B; font-style: italic">_</span><span style="color: #F8F8F2">:) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (R1, R2, R3, R4, R5)</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> request </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">RequestEvalutor</span><span style="color: #F8F8F2">()</span></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> result </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> request.</span><span style="color: #8BE9FD">evaluate</span><span style="color: #F8F8F2">(r1, r2, r3, r4, r5)</span></span></code></pre></div>



<p id="fd05">Mặc dù cách làm như trên có vẻ như không được tốt lắm nhưng các framework như SwiftUI và Combine cũng dựa vào cách làm như trên</p>



<p id="5c06">Nhưng không may một điều là cách làm như trên sẽ gặp một nhược điểm lớn vì bạn không thể triển khai một số lượng đối số chồng chất vô hạn, vì vậy luôn có một giới hạn về số lượng đối số mà hàm của bạn có thể xử lý: </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.42535400390625px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="let result = request.evaluate(r1, r2, r3, r4, r5, r6, r7)
// This code will be error: Extra argrument in call" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> result </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> request.</span><span style="color: #8BE9FD">evaluate</span><span style="color: #F8F8F2">(r1, r2, r3, r4, r5, r6, r7)</span></span>
<span class="line"><span style="color: #6272A4">// This code will be error: Extra argrument in call</span></span></code></pre></div>



<p id="7dde">Một ví dụ thực tế là khi bạn cố gắng implement thật nhiều child view vào 1 VStack hoặc HStack thì SwiftUI chỉ có thể thêm được tối đa 10 child view.</p>



<p id="7cb2">Nhưng nếu bạn sử dụng Xcode 15 và thử thêm 11 child view thì một điều tuyệt vời là không còn warning giới hạn nào ở đây nữa. Có thể thêm bao nhiêu tuỳ thích !</p>



<p id="b654">Vì trong Swift 5.9 này có một tính năng mới gọi là Parameter Packs:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="720" height="181" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/1_ZF7w8J2uZDPb-Zl1LsgaNQ-1.webp" alt="" class="wp-image-1141" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/1_ZF7w8J2uZDPb-Zl1LsgaNQ-1.webp 720w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/1_ZF7w8J2uZDPb-Zl1LsgaNQ-1-300x75.webp 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/1_ZF7w8J2uZDPb-Zl1LsgaNQ-1-380x96.webp 380w" sizes="(max-width: 720px) 100vw, 720px" /></figure>



<p id="ee89">Sử dụng từ khoá&nbsp;<strong>each</strong>, để khai báo một Parameter Pack.</p>



<p id="64f4">Và sau đó, thông qua từ khoá <strong>repeat</strong>, chúng ta có thể sử dụng Parameter Pack này, chẳng hạn để khai báo các đối số của hàm hoặc xác định một tuple type.</p>



<p>Swift 5.9:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:16.854167938232422px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="func zip&lt;each T&gt;(_ input: repeat each T) -&gt; (A, B, C, D) {
    return (repeat each input)
}

//Example
func pairUp&lt;each T, each U&gt;(firstPeople: repeat each T, 
                            secondPeople: repeat each U)
                           -&gt; (repeat (first: each T, second: each U)) {
    return (repeat (each firstPeople, each secondPeople))
}

let result = pairUp(firstPeople: johnny, derek, 
                     secondPeople: kate, kevin)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">zip</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">each</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">T</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B">_</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">input</span><span style="color: #F8F8F2">: repeat each T) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (A, B, C, D) {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> (</span><span style="color: #FF79C6">repeat</span><span style="color: #F8F8F2"> each input)</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">//Example</span></span>
<span class="line"><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">pairUp</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">each</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">T</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9; font-style: italic">each</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">U</span><span style="color: #F8F8F2">&gt;(</span><span style="color: #50FA7B; font-style: italic">firstPeople</span><span style="color: #F8F8F2">: repeat each T, </span></span>
<span class="line"><span style="color: #F8F8F2">                            </span><span style="color: #50FA7B; font-style: italic">secondPeople</span><span style="color: #F8F8F2">: repeat each U)</span></span>
<span class="line"><span style="color: #F8F8F2">                           </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (</span><span style="color: #FF79C6">repeat</span><span style="color: #F8F8F2"> (</span><span style="color: #8BE9FD">first</span><span style="color: #F8F8F2">: each T, </span><span style="color: #8BE9FD">second</span><span style="color: #F8F8F2">: each U)) {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> (</span><span style="color: #FF79C6">repeat</span><span style="color: #F8F8F2"> (each firstPeople, each secondPeople))</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> result </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">pairUp</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD">firstPeople</span><span style="color: #F8F8F2">: johnny, derek, </span></span>
<span class="line"><span style="color: #F8F8F2">                     </span><span style="color: #8BE9FD">secondPeople</span><span style="color: #F8F8F2">: kate, kevin)</span></span>
<span class="line"></span></code></pre></div>



<p>Trước đây:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.425348281860352px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="func zip&lt;T₁, T₂,‥․, Tₙ&gt;(_ i₁: T₁, _ i₂:T₂,‥․,_ iₙ: Tₙ) -&gt; (T₁, T₂,‥․,Tₙ) {
    return (i₁, i₂,‥․, iₙ)
}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">func</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">zip</span><span style="color: #F8F8F2">&lt;</span><span style="color: #BD93F9; font-style: italic">T</span><span style="color: #F8F8F2">₁, T₂,‥․, Tₙ&gt;(</span><span style="color: #50FA7B">_</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">i₁</span><span style="color: #F8F8F2">: T₁, </span><span style="color: #50FA7B">_</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">i₂</span><span style="color: #F8F8F2">:T₂,‥․,</span><span style="color: #50FA7B">_</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">iₙ</span><span style="color: #F8F8F2">: Tₙ) </span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2"> (T₁, T₂,‥․,Tₙ) {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> (i₁, i₂,</span><span style="color: #FF79C6">‥․</span><span style="color: #F8F8F2">, iₙ)</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="a5b5"><span id="03-macros">03. Macros</span></h2>



<p>Ở Swift 5.9, ngôn ngữ swift đã cho ra mắt tính năng <strong>Macros</strong>, không kém gì các plugin có khả năng generating code </p>



<p id="0771">Dưới đây là đoạn code điển hình mà macro có thể tạo cho bạn: xác định một thuộc tính sau khi tính toán cho từng case trong một enum</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:16.854169845581055px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="enum Path {
  case relative(String)
  case absolute(String)
}

let absPaths = paths.filter { $0.isAbsolute }

extension Path {
  var isAbsolute:Bool {
    if case .absolute = self { true }
    else { false }
  }
}

extension Path {
  var isRelative:Bool {
    if case .relative = self { true }
    else { false }
  }
}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">enum</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Path</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">relative</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">absolute</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> absPaths </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> paths.</span><span style="color: #8BE9FD">filter</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9; font-style: italic">$0</span><span style="color: #F8F8F2">.isAbsolute }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">extension</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Path</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">var</span><span style="color: #F8F8F2"> isAbsolute:</span><span style="color: #8BE9FD; font-style: italic">Bool</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> .absolute </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">true</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">  }</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">extension</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Path</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">var</span><span style="color: #F8F8F2"> isRelative:</span><span style="color: #8BE9FD; font-style: italic">Bool</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> .relative </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">true</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2"> }</span></span>
<span class="line"><span style="color: #F8F8F2">  }</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p id="2cc8">Ở Swift 5.9 bạn có thể xoá đoạn code trên và thay vào đó, bạn chỉ cần thêm&nbsp;<strong>@CaseDetection</strong> enum của bạn :</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.425323486328125px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="@CaseDetction
enum Path {
  case relative(String)
  case absolute(String)
}

let absPaths = paths.filter { $0.isAbsolute }" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">@CaseDetction</span></span>
<span class="line"><span style="color: #FF79C6">enum</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Path</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">relative</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">absolute</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> absPaths </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> paths.</span><span style="color: #8BE9FD">filter</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9; font-style: italic">$0</span><span style="color: #F8F8F2">.isAbsolute }</span></span></code></pre></div>



<p id="8fea">Tại thời điểm biên dịch, macro này sau đó sẽ được trình biên dịch Swift generate đoạn code trên giúp bạn:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:16.854156494140625px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Swift</span><span role="button" tabindex="0" data-code="@CaseDetction
enum Path {
  case relative(String)
  case absolute(String)
                               @CaseDection will generate this code 
** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                  *
* var isAbsolute:Bool {                                            *
*  if case .absolute = self { true }                               *
*  else { false }                                                  *
* }                                                                *
*                                                                  *
* var isRelative:Bool {                                            *
*  if case .relative = self { true }                               *
*  else { false }                                                  *
* }                                                                *
*                                                                  *
** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

}

let absPaths = paths.filter { $0.isAbsolute }" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">@CaseDetction</span></span>
<span class="line"><span style="color: #FF79C6">enum</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Path</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">relative</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">absolute</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD; font-style: italic">String</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                               </span><span style="color: #FF79C6">@CaseDection</span><span style="color: #F8F8F2"> will generate this code </span></span>
<span class="line"><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">                                                                  </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">var</span><span style="color: #F8F8F2"> isAbsolute:</span><span style="color: #8BE9FD; font-style: italic">Bool</span><span style="color: #F8F8F2"> {                                            </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> .absolute </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">true</span><span style="color: #F8F8F2"> }                               </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2"> }                                                  </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> }                                                                </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">                                                                  </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">var</span><span style="color: #F8F8F2"> isRelative:</span><span style="color: #8BE9FD; font-style: italic">Bool</span><span style="color: #F8F8F2"> {                                            </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">case</span><span style="color: #F8F8F2"> .relative </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">true</span><span style="color: #F8F8F2"> }                               </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">else</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2"> }                                                  </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> }                                                                </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">*</span><span style="color: #F8F8F2">                                                                  </span><span style="color: #FF79C6">*</span></span>
<span class="line"><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">let</span><span style="color: #F8F8F2"> absPaths </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> paths.</span><span style="color: #8BE9FD">filter</span><span style="color: #F8F8F2"> { </span><span style="color: #BD93F9; font-style: italic">$0</span><span style="color: #F8F8F2">.isAbsolute }</span></span></code></pre></div>



<p id="514a">Và đó là 3 tính năng mới của Swift 5.9 mà mình muốn giới thiệu cho các bạn !!!</p>



<p id="2967"><em>Hi vong các bạn sẽ apply các tính năng này vào dự án của mình  </em>🙌</p>
</div></div>
</div>
</div>
<p>The post <a href="https://blog.tomosia.com.vn/co-gi-hot-trong-swift-5-9-%f0%9f%94%a5%f0%9f%94%a5/">Có gì HOT trong Swift 5.9 🔥🔥</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/co-gi-hot-trong-swift-5-9-%f0%9f%94%a5%f0%9f%94%a5/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
