在ForEach循环中从[任何?]获取项目以显示文本

时间:2020-08-25 23:10:03

标签: 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 }
}

但是现在我得到一个错误,说“任何”?必须继承自NSObject。

有更简单的方法吗?

1 个答案:

答案 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)
        }
    }
}