编辑: 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();
}
}
答案 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