我正在开发一个SWIFT包,其中的一个选项是传入一个泛型类型(Person),然后GenericStruct可以使用传入的该类型的属性.显然,问题是通用T不知道传入的是什么.Is there a way to define the property to access on the generic type 102?

struct Person: Equatable {
    var name: String
    var height: Double
}

struct ContentView: View {
    @State private var james = Person(name: "James", height: 175.0)
    
    var body: some View {
        GenericStruct(person: $james)
    }
}

struct GenericStruct<T: Equatable>: View {
    @Binding var person: T
    
    var body: some View {
        Text(person.name)) // This line.
    }
}

我希望在将Person传递给GenericStruct时明确传递要访问的属性.该属性不会始终为name,它可以是我定义的Person内的任何值.例如:

GenericStruct(person: $james, use: Person.name)

推荐答案

这不正是一项协议吗?

protocol NameProviding {
    var name: String { get }
}

struct GenericStruct<T: Equatable & NameProviding>: View { ... }

或者,这个问题还有更微妙的部分吗?


要做到这一点,最好的方法是传递字符串绑定:

struct GenericStruct: View {
    @Binding var text: String
    
    var body: some View {
        Text(text)) // This line.
    }
}

GenericStruct(text: $james.name)

但对于关键路径来说,这是可能的.在这种特殊情况下,它只是有点笨拙和不太灵活:

// Should be the syntax, but I haven't double-checked it.
struct GenericStruct<T: Equatable>: View {
    @Binding var person: T
    var use: KeyPath<T, String>
    
    var body: some View {
        Text(person[keyPath: use]))
    }
}

GenericStruct(person: $james, use: \.name)

Swift相关问答推荐

绑定到可选值的非可选属性?'

SwiftData查询按日期排序的项的属性数组

在解码字符串时需要帮助.

阻塞(受CPU限制的)任务的异步功能?

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

swift:只要框架名称中有一个带有框架名称的公共实体,就指定框架中公共 struct 的路径

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

如何制作进度加载动画?

使用 WrappingHStack 文本溢出到新行

如何从数据中读取以空结尾的字符串?

创建 ViewModel 时 iOS 模拟器上的黑屏

您可以在运行时访问 Picker 元素并更改它们的 colored颜色 吗

如何仅将 SwiftUI 不透明度应用于父视图?

组合 flatMap 不会返回预期的上下文结果类型

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

swift 如何从 Int 转换?到字符串

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

如何在swift中的每N个字符处为字符串添加分隔符?