🔰Optional Views

此篇討論如何用 SwiftUI 產生 Optional View 的一些方法。

利用 .map()

SwiftUI is perfectly happy working with optional views, such as Image? and Text?. 👉 SwiftUI: Handling optionals - Erica Sadun

let value: Int? = 1
let view = value               // Int?
    .map { Text("\($0)") }     // Text?

直接使用 Optional View

上面的 .map() 是間接使用了 Optional View,但這裡的方法是直接使用 Optional View。在下面的範例中,我們必須送兩個 @ViewBuilder closure 給 MyView 使用,讓它可以製造兩個 View,但注意:其實第二個是一個 Optional View (RightContent?),然後 MyView 再拿這兩個 View 到 body 中去製造最後要的結果。

接著,在 MyView 的 extension 中,我們定義了另一個 .init(),只要送進一個 @ViewBuilder closure 給它就可以,第二個 View 會被自動做成 nil (== EmptyView?.none)。

import SwiftUI

// 📦 MyView<LeftContent, RightContent>
struct MyView<LeftContent: View, RightContent: View>: View {
    
    let leftContent : LeftContent
    let rightContent: RightContent?  // ⭐️ Optional<RightContent>
    
    // ⭐️ MyView(makeLeftContent: {}, makeRightContent: {})
    init(
        @ViewBuilder makeLeftContent : () -> LeftContent, 
        @ViewBuilder makeRightContent: () -> RightContent?
    ) {
        self.leftContent  = makeLeftContent()
        self.rightContent = makeRightContent()
    }
    
    var body: some View {     // MyView.Body
        HStack {              // HStack<TupleView<(L, R)>>
            self.leftContent  // L: LeftContent
            self.rightContent // R: Optional<RightContent>
        }
    }
}

其他方法

Last updated