Как создать общую собственность c? - PullRequest
0 голосов
/ 25 мая 2020

У меня протокол Transaction. Реализовано несколькими структурами: Income, Expense, et c ..

Затем у меня есть общий c 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, компилятор говорит:

Значение типа протокола «Транзакция» не может соответствовать «Транзакции»; только типы struct / enum / class могут соответствовать протоколам

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Если вы установите диспетчер через TransactionView конструктор, вы можете сделать что-то вроде этого

struct TransactionView<T:Transaction>: View {

    @ObservedObject var manager: TransactionManager<T>

    var body: some View {
         Text("Hello")
    }
}
0 голосов
/ 25 мая 2020

Здесь вам нужно указать конкретный тип, который соответствует протоколу Transaction, единственное решение - создать несколько менеджеров для каждого типа протокола.

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