代码之家  ›  专栏  ›  技术社区  ›  Ian

调用协议扩展中的方法,而不是视图控制器中的方法实现

  •  0
  • Ian  · 技术社区  · 7 年前

    所以我有一个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 回复  |  直到 7 年前
        1
  •  2
  •   Sweeper    7 年前

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

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

    protocol ViewDelegate: class {
    
        func theNOTOptionalMethod()
        func theOptionalMethod()
    
    }
    

    或者,你可以使用 @objc optional 修饰语:

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

    当你打电话的时候 optionalMethod ,您需要打开可选的:

    delegate.optionalMethod?()