Я пытаюсь понять, как вы хотите использовать это, так что это моя идея о том, как использовать протокол. Я не уверен, что это ответ на ваш вопрос, но, возможно, это поможет вам приблизиться к решению.
Скажем, у нас есть эта модель, которую мы хотим сохранить
struct Item {
var id: Int
var name: String
}
Тогда нам нужен обработчик, который может выполнять операции с БД.
struct ItemDbHandler: ICRUDOperation {
typealias T = Item
func insert(data: Item) {
print("\(#function) \(item)")
}
func update(data: Item) {
print("\(#function) \(item)")
}
func get(data: Item) -> [Item] { //shouldn't this return 1 element
print("\(#function) \(item)")
return []
}
// and so on...
}
И с некоторой функцией делегата
func delegateUpdate<W>(sqlite: W, service: W, data: W.T) where W: ICRUDOperation {
sqlite.update(data: data)
}
мы можем работать с обработчиком напрямую или через функцию
var item = Item(id: 1, name: "ABC")
var handler = ItemDbHandler()
handler.insert(data: item)
item.name = "abc"
delegateUpdate(sqlite: handler, service: handler, data: item)
Запуск этого на детской площадке дает
вставить (данные :) Элемент (id: 1, имя: "ABC")
обновление (данные :) Элемент (id: 1, имя: "abc")
Я не понимаю, что вы хотите сделать fillDecision
, поэтому я пропустил это сейчас.