SmT*_*SmT 2 java interface ios swift swift3
编辑:Swift 中 java 接口或目标 c 协议的等价物有什么不同?这个问题?
读完那个话题后,我认为使用类来扩展协议是一种选择,我尝试创建协议本身但没有成功,但是正如 Duncan 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();
}
}
Run Code Online (Sandbox Code Playgroud)
正如 Connor 在他的回答中所说,Swift 相当于一个接口是一个协议。
再次借用康纳的回答:
protocol MyEngine {
func doWork() -> Bool
}
Run Code Online (Sandbox Code Playgroud)
您不能直接实例化 MyEngine 类型的对象。相反,您需要定义一个或多个符合协议的对象:
class Obj1: MyEngine {
func doWork() -> Bool {
print("in Obj1 doWork()")
return true
}
}
class Obj2: MyEngine {
func doWork() -> Bool {
print("in Obj2 doWork()")
return true
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以定义符合协议的对象数组:
var objArray = [MyEngine]()
Run Code Online (Sandbox Code Playgroud)
然后填充数组:
objArray.append(Obj1())
objArray.append(Obj2())
objArray.append(Obj2())
objArray.append(Obj1())
Run Code Online (Sandbox Code Playgroud)
然后你可以说
objArray.forEach{$0.doWork()}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6823 次 |
| 最近记录: |