【问题标题】:Swift instance of protocolSwift 协议实例
【发布时间】:2016-04-07 06:52:01
【问题描述】:

我可以在 swift 中创建协议的实例吗?

像 java 中的接口实例一样?

Java:

public interface test {
    void test();
}

new test() {
    @Override
    public void test() {
        //...
    }
}

斯威夫特:

protocol ITransmitter {
    func onExecuteSuccess(data:String)
}

//instance???

【问题讨论】:

  • 我们可以做类似的事情 var callHandler: CallsHanlerProtocol = CallHandler()
  • 哎,你也不能创建java接口的实例。

标签: ios swift ipad interface protocols


【解决方案1】:

您不能创建协议实例。

例如

protocol ITransmitter {
    func onExecuteSuccess(data:String)
}

var protocolInstance : ITransmitter = ITransmitter() // << Not allowed. This is an error

但是,您可以在代码中使用协议作为唯一类型来引用对象。假设您有一个符合此协议的类,但在您的代码中,您的要求只是能够在其上调用协议方法,并且您不关心该类的实例支持的任何其他方法。

例如-

class A{
  func foo(){

  }
}
extension A : ITransmitter{

 func onExecuteSuccess(data:String){
    //Do stuff here
  }
}

//This function wants to run the ITransmitter objects, so it uses only protocol //type for its argument. The transmitter can be of any class/struct, but has to //conform to ITransmitter protocol

func runTransmittor(transmitter : ITransmitter){
     //some other statements here..
     transmitter. onExecuteSuccess(data :SomeData){
     }
}

【讨论】:

    【解决方案2】:

    我创建了符合协议的内部类并分配了该类的对象

    class Outer {
        private final class Inner: ITransmitter {
            unowned let parent: Outer
            init(parent: Outer) {
                self.parent = parent
            }
            func onExecuteSuccess(data:String){
            }
        }
        var inner: Inner! = nil
        init() {
            inner = Inner(parent: self)
        }
    }
    

    Do Swift inner classes have access to self of outer class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2016-09-22
      相关资源
      最近更新 更多