#ios #swift #protocols
#iOS #swift #протоколы
Вопрос:
Я добавил библиотеку MBDocCapture в свой проект, используя CocoaPods. Теперь, как предполагает его readme, я привел свой контроллер просмотра в соответствие с ImageScannerControllerDelegate
и добавил все 4 метода протокола в свой код:
extension DocumentUploaderViewController: ImageScannerControllerDelegate {
func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithResults results: ImageScannerResults) {
scanner.dismiss(animated: true)
}
func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithPage1Results page1Results: ImageScannerResults, andPage2Results page2Results: ImageScannerResults) {
scanner.dismiss(animated: true)
}
func imageScannerControllerDidCancel(_ scanner: ImageScannerController) {
scanner.dismiss(animated: true)
}
func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
scanner.dismiss(animated: true)
}
}
Теперь Xcode (10.2.1) жалуется, что мне все еще не хватает некоторых заглушек протокола:
Тип ‘DocumentUploaderViewController’ не соответствует протоколу ‘ImageScannerControllerDelegate’
Вы хотите добавить заглушки протокола?
Когда я нажимаю Fix
, Xcode добавляет didFailWithError
метод:
func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
}
… и затем жалуется, что я добавил недопустимое повторное объявление метода (потому что он уже был там!):
Недопустимое повторное объявление ‘imageScannerController(_:didFailWithError:)’
Я уже пробовал:
- сборка
- очистка производных данных
- очистка и сборка
- завершите Xcode, очистите, создайте
- перезагрузите мой Mac (10.14.3), откройте Xcode, очистите, соберите
Ни одна из этих попыток не помогла.
Есть идеи?
Комментарии:
1. добавьте некоторый дополнительный код.
2. @Anbu.Karthik какой дополнительный код я должен опубликовать? Другого кода, который я бы счел относящимся к этому вопросу, нет.
3. я думаю, что это вопрос только версии, не могли бы вы, пожалуйста, сказать мне, какую swift-версию MBDocCapture вы используете? и версия swift для вашего проекта?
4. также можете ли вы опубликовать функцию, которая показывает ошибку повторного объявления?
5. @AbuUlHassan в моем проекте используется Swift 4. MBDocCapture 0.1.1 использует Swift 4.2, однако в примере проекта также используется Swift 4. Xcode пытается повторно добавить
didFailWithError
метод и, следовательно, выдает ошибку повторного объявления для этого метода после добавления.
Ответ №1:
Возможно, в вашем проекте явно определена Error
модель (структура или класс), которая вызывает эту проблему.
Чтобы исправить это, у вас есть два варианта:
- переименуйте свою модель, например
MyError
- или измените объявление метода на
didFailWithError error: Swift.Error
Эта ошибка всегда появляется, когда возникает конфликт в области видимости модели. Текущие заглушки делегатов, написанные для extension DocumentUploaderViewController: ImageScannerControllerDelegate
, учитывают Error
модель вашего проекта, определенную в локальной области видимости, в то время как заглушка делегата ожидает Error
модель, определенную в Swift.
Комментарии:
1. Потрясающий улов! У меня действительно есть
Error
модель в моем проекте. Я изменил метод наdidFailWithError error: Swift.Error
, и теперь он работает. Спасибо!
Ответ №2:
- Ищите метод во всем проекте, такого рода ошибки обычно возникают, когда функции имеют похожие имена или объявляются дважды.
-
Проверьте, установили ли вы делегат для соответствующего контроллера представления. Что-то вроде:
let scannerViewController = ImageScannerController()
scannerViewController.imageScannerDelegate = self
Комментарии:
1. Я разрешаю автозаполнению Xcode добавлять методы для меня, поэтому имена определенно идентичны. Я также установил делегат, но он даже не будет компилироваться…
Ответ №3:
Не добавляйте методы вручную. Удалите все методы и когда xcode жалуется — «Тип ‘DocumentUploaderViewController’ не соответствует протоколу ‘ImageScannerControllerDelegate’ Вы хотите добавить заглушки протокола?»
Просто нажмите исправить. И вы закончили.
Комментарии:
1. xcode иногда делает это. И еще одна вещь после добавления методов протокола ctrl B project.
2. Я объяснил в своем сообщении, что я сделал это, и он пожаловался на повторное объявление. Следовательно, все имена методов указаны правильно.
3. Я прочитал ваш пост, и я сталкивался с этой проблемой 100 раз. это всегда исправляет это
4. Я знаю, что обычно это устраняет проблему, но на этот раз этого не происходит, и именно по этой причине я опубликовал этот, казалось бы, глупый вопрос в первую очередь.
5. В этом случае вы можете очистить производные данные и повторить попытку