【问题标题】:How do you create a generic property?如何创建通用属性?
【发布时间】:2020-05-25 20:24:06
【问题描述】:

我有一个Transaction 协议。由几个结构体实现:IncomeExpense 等。

然后我有一个通用的TransactionMananger 类:

class TransactionManager<T:Transaction>: ObservableObject {
    private let key:String = String(describing: T.self)
    @Published var items: [T]
    // ...

效果很好。

现在我正在尝试构建一个视图,它将接收任何类型(收入、支出等)的TransactionManager

struct TransactionView: View {
    @ObservedObject var manager: TransactionManager<???>

    var body: some View {
        Text("Hello")
    }
}

我不知道如何指定这应该是任何Transaction。当我使用 Transaction 本身时,编译器会说:

协议类型'Transaction'的值不能符合'Transaction';只有结构/枚举/类类型可以符合协议

【问题讨论】:

  • manager 在 TransactionView 中是私有的,那么什么时候设置这个属性呢?
  • 我的错,它不应该是私人的
  • 也许问问自己为什么在这里需要一个泛型。为什么仅仅在管理器对象中使用Transaction 协议是不够的?如果您确实想使用泛型,那么您的视图也需要使用泛型,如 Sorin 所示

标签: ios swift swiftui


【解决方案1】:

如果您通过TransactionView 构造函数设置管理器,那么您可以执行类似的操作

struct TransactionView<T:Transaction>: View {

    @ObservedObject var manager: TransactionManager<T>

    var body: some View {
         Text("Hello")
    }
}

【讨论】:

    【解决方案2】:

    你需要在这里给出一个符合Transaction协议的具体类型,唯一的解决方法是为每种类型的协议创建多个管理器。

    @ObservedObject private var incomeManager: TransactionManager<Income>
    @ObservedObject private var expenseManager: TransactionManager<Expense>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多