swiftswiftuiwwdc

How to give default value to TableColumn in Table


I have this sample code:

struct Item: Identifiable {
    
    var id = UUID()
    
    var name: String?
}

struct ItemTable: View {
    
    let items: [Item]
    
    var body: some View {
        Table(items) {
            TableColumn("Name", value: \.name)
        }
    }
}

I get the following error:

Key path value type 'String?' cannot be converted to contextual type 'String'

I can solve using \.name!, but I'd like to give a default value instead (something like \.name ?? "default").

How can I achieve this?


Solution

  • There is a TableColumn init that lets you create the content in a closure

    var body: some View {
        Table(items) {
            TableColumn("Name") { item in
                 Text(item.name ?? "default")
            }
        }
    }
    

    or solve it with a wrapped property

    extension Item {
        var itemName: String {
            name ?? "default"
        }
    }
    

    In the view

    var body: some View {
        Table(items) {
            TableColumn("Name", value: \.itemName)
        }
    }