下面是我正在尝试的一些代码
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 }
}
但是现在我得到一个错误,说“任何”?必须继承自NSObject。
有更简单的方法吗?
答案 0 :(得分:1)
可能的解决方案是使用您已经创建的id
扩展名:
var body: some View {
VStack {
ForEach(optionalArray) { i in
Text(i.id)
}
}
}
请注意,并非所有对象都可以转换为字符串(如果无法将对象转换为字符串,self as! String
将会失败)。
更好的方法是使用String(describing:)
。
为此,您可以创建另一个扩展名(已更新,删除了 Optional 一词,如果有的话):
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)
}
}
}