#swift #swiftui
#swift #swiftui
Вопрос:
Ниже приведен некоторый код, который я пробовал
import SwiftUI
struct AnyOptional: View {
private var optionalArray: [Any?] = [1, 2, 3]
var body: some View {
VStack {
ForEach(optionalArray) { i in
Text("(i)")
}
}
}
}
extension Optional: Identifiable {
public var id: String { self as! String }
}
struct AnyOptional_Previews: PreviewProvider {
static var previews: some View {
AnyOptional()
}
}
У меня была аналогичная проблема с [String], которую я решил с помощью этого расширения
extension String: Identifiable {
public var id: String { self }
}
но теперь я получаю сообщение об ошибке Any? должно наследоваться от NSObject.
Есть ли более простой способ сделать это?
Ответ №1:
Возможное решение — использовать ваше уже созданное id
расширение:
var body: some View {
VStack {
ForEach(optionalArray) { i in
Text(i.id)
}
}
}
Обратите внимание, что не все объекты могут быть преобразованы в строку ( self as! String
произойдет сбой, если объект не может быть преобразован в строку).
Лучший способ — использовать String(describing:)
.
Для этого вы можете создать другое расширение (обновлено, чтобы удалить слово Необязательно, если есть какое-то значение):
extension Optional {
public var asString: String {
if let value = self {
return .init(describing: value)
}
return .init(describing: self)
}
}
и использовать его в ForEach
цикле:
var body: some View {
VStack {
ForEach(optionalArray, id: .asString) { i in
Text(i.asString)
}
}
}
Комментарии:
1. спасибо, я нашел ваше решение лучше, поскольку оно не вызывает принудительного развертывания и, следовательно, не завершается сбоем, когда данные возвращают nil. просто сейчас это необязательно (» «), так что просто нужно поработать над решением этих
2. @HenryHudson Я обновил расширение, чтобы удалить необязательную форму
asString
.