gpt4 book ai didi

ios - SwiftUI 允许 Struct 中的所有字符串枚举

转载 作者:行者123 更新时间:2023-12-02 02:36:06 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我试图允许所有字符串枚举作为结构中变量的类型。下面的代码是完全错误的,但我希望它能让我的问题更清楚。

我的想法是使所有枚举符合相同的协议(protocol),但我无法使用这种方法访问 .allCases。

我的目标是我可以将任何字符串枚举传递给 ListView,然后 ListView 将显示枚举的所有组件(此处:一;二;三)。

有人知道如何做到这一点吗?它一定是一个非常基本的 Swift 东西,但我无法通过网络搜索找到它。非常感谢!

import SwiftUI

struct ContentView: View {

var body: some View {
ListView(myEnum: Elements.self) //error here as well
}
}

protocol StringRepresentable {
var rawValue: String { get }
}

enum Elements: String, Equatable, CaseIterable, StringRepresentable {
case one
case two
case three
}

struct ListView: View {
let myEnum: StringRepresentable //doesn't work

var body: some View {
ForEach(myEnum.allCases, id: \.self) { elem in //can't access .allCases
Text(elem.rawValue)
}
}
}

最佳答案

您的原始代码中有几个错误。首先,您没有使用 VStack (或 ListLazyVStack),因此您的 foreach 只会呈现一个元素。

其次,您将类型而不是元素本身传递给 ListView 。最后,您自己的 StringRepresentable 协议(protocol)是不必要的,您可以使用 RawRepresentable 及其关联类型 RawValue 约束为 String

即像这样的东西:

struct ContentView: View {
var body: some View {
VStack {
ListView(values: Fruits.allCases)
ListView(values: Animals.allCases)
}
}
}

enum Fruits: String, CaseIterable {
case apple
case orange
case banana
}

enum Animals: String, CaseIterable {
case cat
case dog
case elephant
}

struct ListView<T: RawRepresentable & Hashable>: View where T.RawValue == String {
let values: [T]

var body: some View {
LazyVStack {
ForEach(values, id: \.self) { elem in
Text(elem.rawValue)
}
}
}
}

渲染效果如下

render

关于ios - SwiftUI 允许 Struct 中的所有字符串枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64286480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com