Таблица SwiftUI iOS16 с дополнительной строкой в ​​качестве пути к ключу

Как создать TableColumn для необязательного свойства? Должен ли я развернуть его в моей модели, чтобы сделать его пустой строкой, если это nil?

extension SomeObject {
    var someOptionalStringUnwrapped: String { return someOptionalString ?? "" }
}
Table(someObject) {
    TableColumn("One", value: \.someString)
    TableColumn("Two", value: \.someOptionalString) // <--shows error mentioned below
    TableColumn("Three", value: \.someOptionalStringUnwrapped) // <--compiles
}

Тип значения пути ключа 'String?' не может быть преобразован в контекстный тип 'String'


Решение

Для простых свойств, таких как строки и числа, стратегия развертывания кажется самым простым способом решить эту проблему (либо общее расширение, как в ответе, либо для каждого свойства, как в вопросе). Для более сложного пользовательского интерфейса всегда можно вернуться к пользовательскому интерфейсу:

TableColumn("DEMO") { someObject in
    ...
    Text("\(someObject.someValue)")
    ...
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы сказали, одним из способов решения этой проблемы является развертывание необязательного в модели. Другим решением было бы объявить расширение для опций, поэтому вам не нужно делать это для каждого свойства, подобного этому.

// this could also be "where Wrapped: StringProtocol"
extension Optional where Wrapped == String {
    var unwrapOrEmpty: Wrapped {
        self ?? ""
    }
}
TableColumn("Given Name", value: \.someOptionalString.unwrapOrEmpty)

В качестве альтернативы создайте расширение для всех RangeReplaceableCollection, которым соответствует String.

extension Optional where Wrapped: RangeReplaceableCollection {
    var unwrapOrEmpty: Wrapped {
        self ?? .init() // init() makes an empty collection
    }
}

Третий способ — использовать другую перегрузку TableColumn, например вот эту, которая позволяет указать собственное представление Content.

init(_ titleKey: LocalizedStringKey, @ViewBuilder content: @escaping (RowValue) -> Content)

Вы можете написать расширение для TableColumn, которое делегирует указанному выше инициализатору:

extension TableColumn where RowValue: Identifiable, Sort == Never, Content == Text, Label == Text {
    init(
        _ titleKey: LocalizedStringKey,
        value: KeyPath<RowValue, String?>
    ) {
        self.init(titleKey) { rowValue in
            Text(rowValue[keyPath: value] ?? "")
        }
    }
}

Имеет смысл писать удобные расширения, но это означает, что распаковка — это путь. Спасибо за информацию

Deitsch 08.05.2023 14:53

Вау, какой отличный ответ. Также очень полезно для многих других необязательных случаев, например. CoreData!

ChrisR 08.05.2023 23:23

Другие вопросы по теме