Swift 中等效的 Java 接口

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)

Dun*_*n C 7

正如 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)