Метод в расширении протокола вызывается вместо реализации метода в View Controller

Поэтому у меня есть viewController, который содержит пользовательский вид,

и этот класс viewController соответствует ViewProtocol

Я ожидаю когда someAction метод срабатывает в someCustomizedView

это будет печатать " method in otherCustomizedClass called "

но это печатает (" method in extension Called") вместо.

theNotOptionalMethod работает просто отлично, но не опциональный метод.

Есть ли что-то, что я неправильно понимаю расширения протокола?

Пожалуйста, помогите, боролись в течение нескольких часов, спасибо

protocol ViewDelegate: class {

    func theNOTOptionalMethod()

}

extension ViewDelegate {

    func theOptionalMethod(){
        print (" method in extension Called")
    }
}

class someCustomizedView: UIView {

    weak var deleage: ViewDelegate?

    @IBAction func someAction(sender: UIButton) {
        deleage?.theOptionalMethod()
    }
}

class someCustomizedVC: UIViewController, ViewDelegate {

    lazy var someView: someCustomizedView = {
        var v = someCustomizedView()
        v.deleage = self
        return v
    }()


    //...... someView added to controller


    func theNOTOptionalMethod() {
        // do nothing
    }

    func theOptionalMethod() {
        print (" method in otherCustomizedClass called ")
    }

}

1 ответ

Решение

Так работают методы в расширениях. Они скрывают реализации в классе.

Чтобы создать протокол с дополнительными методами, вам нужно поместить дополнительный метод в определение протокола:

protocol ViewDelegate: class {

    func theNOTOptionalMethod()
    func theOptionalMethod()

}

Кроме того, вы можете использовать @objc а также optional модификаторы:

@objc protocol MyDelegate : class{
    func notOptionalMethod()
    @objc optional func optionalMethod()
}

Когда вы звоните optionalMethod, вам нужно развернуть необязательное:

delegate.optionalMethod?()
Другие вопросы по тегам