2016-11-30 52 views
-3

编辑:什么是What is the equivalent for java interfaces or objective c protocols in swift?和这个问题有什么不同?我读的话题Java接口相当于斯威夫特

后,我还以为是使用一个类来扩展协议的选项,我试图创建协议本身没有成功,但邓肯C.说这是不可能的直接初始化协议类型,我必须用另一个类来扩展它。我有一个Java类,我拥有一个接口数组,我可以循环访问该数组,并调用doWork()函数,直到其中一个返回true。我想在Swift中实现相同的功能。

我的java类:

class MyClass{ 
    //create a variable that holds all of my engines 
    private MyEngine[] myEngines = new MyEngine[]{ 
     new MyEngine(){ 
      @Override 
      public boolean doWork(){ 
       return doWork1(); 
      }   
     }, 
     new MyEngine(){ 
      @Override 
      public boolean doWork(){ 
       return doWork2(); 
      }   
     }, 
     new MyEngine(){ 
      @Override 
      public boolean doWork(){ 
       return doWork3(); 
      }   
     } 
    } 

    //loop through all engines until one of them succeed 
    public boolean doWorkUntilSuccess(){ 
     for(int i = 0; i < myEngines.length; i++){ 
      if(myEngines[i].doWork()) 
       return true; 
     } 
     return false; 
    } 

    private boolean doWork1(){ 
     //code 
     return result; 
    } 

    private boolean doWork2(){ 
     //code 
     return result; 
    } 

    private boolean doWork3(){ 
     //code 
     return result; 
    } 

    interface MyEngine{ 
     boolean doWork(); 
    } 
} 
+4

如果您要求某人将您的Java代码翻译成Swift而未显示您迄今为止所做的工作,则可能会得到负面投票。 –

回答

2

与接口相同的Swift是一个协议,正如Connor在他的回答中所说的那样。

再次,从Connor的回答借款:

protocol MyEngine { 
    func doWork() -> Bool 
} 

你不能直接实例类型MyEngine的OBJETS。相反,你需要定义符合协议的一个或多个对象:

class Obj1: MyEngine { 
    func doWork() -> Bool { 
     print("in Obj1 doWork()") 
     return true 
    } 
} 

class Obj2: MyEngine { 
    func doWork() -> Bool { 
     print("in Obj2 doWork()") 
     return true 
    } 
} 

然后,您可以定义对象的数组,符合协议:

var objArray = [MyEngine]() 

然后填充数组:

objArray.append(Obj1()) 
objArray.append(Obj2()) 
objArray.append(Obj2()) 
objArray.append(Obj1()) 

然后你可以说

objArray.forEach{$0.doWork()} 
2

什么你要找的是一个protocol

protocol MyEngine { 
    func doWork() -> Bool 
} 

类然后可以实现该协议。然而,没有相当于(据我所知)说new MyEngine()。你需要声明一个实现协议的类或结构。

0

你可以把所需的功能集成到阵列那样:

var firstFunction = { 
    print("1") 
} 

var secondFunction = { 
    print("2") 
} 

let functions: [() ->()] = [firstFunction, secondFunction] 

for function in functions { 
    function() 
} 

日志输出:

1 
2 
0

Java接口相当于斯威夫特

是一个协议:The Swift Programming Language (Swift 3.0.1): Protocols

你MyEngine接口应该是这样的:

protocol MyEngine { 
    func doWork() -> Bool 
} 

虽然所显示的使用情况下,你可能只使用一个封闭。像这样:

class WorkToDo { 
    typealias WorkerFunc =() ->() 

    let workStuff : [ WorkerFunc ] = [ 
    { ... do work 1 ... }, 
    { ... do work 2 ... }, 
    { ... do work 3 ... } 
    ] 

    func doAllWork() { 
    for work in workStuff { 
     work() 
    } 
    } 
}