2016-11-30 55 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() 
    } 
    } 
}