Java界面等效于Swift

时间:2016-11-30 14:10:17

标签: java ios swift interface swift3

  

编辑: What is the equivalent for java interfaces or objective c protocols in swift?与此问题有什么不同?

在我读完该主题后,我认为使用类扩展协议是一个选项,我试图创建协议本身没有成功,但正如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();
    }
}

3 个答案:

答案 0 :(得分:3)

如同Connor在答案中所说,Swift等同于接口是一个协议。

再次借鉴Connor的回答:

protocol MyEngine {
    func doWork() -> Bool
}

您无法直接实例化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
    }
}

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

var objArray = [MyEngine]()

然后填充数组:

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

然后你可以说

objArray.forEach{$0.doWork()}

答案 1 :(得分:2)

您正在寻找的是protocol

new MyEngine()

然后,类可以实现协议。但是,据WO1519641 WO1528113TB WO1530212 TB说,没有相应的(据我所知)。您需要声明一个实现协议的类或结构。

答案 2 :(得分:0)

您可以将所需的函数放入数组中:

var firstFunction = {
    print("1")
}

var secondFunction = {
    print("2")
}

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

for function in functions {
    function()
}

日志输出:

1
2