0

所以我有一个包含自定义视图的 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 ")
    }

}
4

1 回答 1

2

这就是扩展中的方法的工作方式。他们将实现隐藏在一个类中。

要创建带有可选方法的协议,您需要将可选方法放在协议定义中:

protocol ViewDelegate: class {

    func theNOTOptionalMethod()
    func theOptionalMethod()

}

或者,您可以使用@objcoptional修饰符:

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

当你调用时optionalMethod,你需要解开可选的:

delegate.optionalMethod?()
于 2018-06-01T07:48:04.197 回答