У меня есть функция с общими параметрами, и при ее вызове я получаю сообщение об ошибке Value of protocol type 'AddableObject' cannot conform to 'AddableObject'; only struct/enum/class types can conform to protocols
У меня есть следующий класс и протоколы
class DataManager{
func updateItem<Item: AddableObject>(itemToUpdate: Item, updateValues: [String : Any], completion: @escaping ((Result<Item, Error>) -> ())){ }
}
protocol AddableObject{ }
Это код в моем ВК
class vc: UIViewController{
weak var task: Task?
viewDidLoad(){
super.viewDidLoad()
}
private func uploadTask(){
guard let taskToUpdate = self.task else{return}
//this is where I get the error
DataManager.shared.updateItem(itemToUpdate: taskToUpdate, updateValues: ["index": 1]){result in
}
}
}
Это мой объект задачи
class Task: AddableObject{
}
Когда я пытаюсь вызвать метод updateItem
из своего VC, я получаю сообщение об ошибке
Value of protocol type 'AddableObject' cannot conform to 'AddableObject'; only struct/enum/class types can conform to protocols
Почему я получаю эту ошибку?
Одна очевидная проблема: ваше объявление weak var task: Task?
объявляет необязательный. Но параметр itemToUpdate:
не является необязательным. Это универсальный тип, который соответствует AddableObject, а необязательное не является чем-то, что соответствует AddableObject.
Если мы исправим это и другие очевидные проблемы в коде, который вы показали, полученный код отлично скомпилируется:
class DataManager{
func updateItem<Item: AddableObject>(itemToUpdate: Item, updateValues: [String : Any], completion: @escaping ((Result<Item, Error>) -> ())){ }
}
protocol AddableObject{ }
class vc: UIViewController{
weak var task: Task?
private func uploadTask(){
guard let taskToUpdate = self.task else {return}
DataManager().updateItem(itemToUpdate: taskToUpdate, updateValues: ["index": 1]){result in
}
}
}
class Task: AddableObject{
}
Таким образом, я должен заключить, что проблема в коде, который вы нам не показали или представили в ложном свете.
Да, только что отредактировал свой код, чтобы то, что я передаю в itemToUpdate, больше не было необязательным. Я все равно получаю ту же ошибку
@matt, ты прав, моя ошибка. Только что отредактировал вопрос