如何解决在ForEach循环中从[任何?]获取项目以显示文本
下面是我正在尝试的一些代码
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。
有更简单的方法吗?
解决方法
可能的解决方案是使用您已经创建的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)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。