调用协议扩展中的方法而不是View Controller中的方法实现

时间:2018-06-01 07:40:11

标签: ios swift protocols swift-protocols protocol-extension

所以我有一个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 :(得分:1)

这就是扩展方法的工作原理。它们将实现隐藏在类中。

要使用可选方法创建协议,您需要将可选方法放在协议定义中:

protocol ViewDelegate: class {

    func theNOTOptionalMethod()
    func theOptionalMethod()

}

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

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

当您致电optionalMethod时,您需要打开可选项:

delegate.optionalMethod?()