метод в расширении протокола вызывается вместо реализации метода в View Controller - PullRequest
0 голосов
/ 01 июня 2018

поэтому у меня есть 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 Ответ

0 голосов
/ 01 июня 2018

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

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

protocol ViewDelegate: class {

    func theNOTOptionalMethod()
    func theOptionalMethod()

}

В качестве альтернативы вы можете использовать @objc и optional модификаторы:

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

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

delegate.optionalMethod?()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...