В Swift протокол, такой как CLLocationManagerDelegate
, предоставляет план «материала», который должен реализовать класс, структура или перечисление, чтобы сказать, что он «соответствует» этому конкретному протоколу. (Также могут быть необязательные методы, которые не обязательно должны быть реализованы.)
В вашем первом примере:
class myVC: UIViewController, CLLocationManagerDelegate { }
myVC
говорит, что он реализует / соответствует протоколу CLLocationManagerDelegate
. Для этого он должен реализовать все необходимые методы этого протокола и может также реализовать любые необязательные ; такие как locationManager(_:didUpdateLocations:)
.
Если я понимаю ваш вопрос, вы хотели бы знать, можете ли вы в итоге реализовать myClass
, не сказав, что он реализует CLLocationManagerDelegate
. Примерно так:
class myVC: UIViewController {
var locationManagerDelegate = SomethingImplementingTheDelegate()
}
class SomethingImplementingTheDelegate: CLLocationManagerDelegate {
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { /*...*/ }
}
Как видите, вам все еще нужен некоторый класс / struct / enum, который реализует то, что говорит протокол / делегат CLLocationManagerDelegate
, так как (протокол) это просто проект.
(Техническое примечание: протоколы могут обеспечивать некоторую реализацию через расширения протокола, но для согласованных типов вы все еще не можете создать экземпляр протокола).