如果有多个一致性,委托如何知道调用函数的位置

时间:2017-05-18 20:25:57

标签: ios swift delegates

我刚刚开始了解iOS swift中的委托模式。如果我错了,请纠正我,但这是我的理解:

委托模式用于将任务委托给另一个类,以使类只有一个作业和一个作业,任何不相关的作业都将委托给负责此作业的另一个类。现在这里是令人困惑的部分:

protocol Addition {
    func addTwoNumbers(_ number1: Int, _ number2: Int)
}

class A: Addition {

    func addTwoNumbers(_ number1: Int, _ number2: Int) {
        print("The number is: \(number1 + number2)")
    }
}

class B {

    let apple = 10
    let orange = 20

    var delegate: Addition?

    func runAddition() {
        delegate?.addTwoNumbers(apple, orange)
    }
}

let bob = B()
bob.runAddition()

B类需要执行添加任务而不是实现该功能,我将让A类通过协议完成工作。现在这里是我困惑的地方。 B类如何知道运行func addTwoNumbers函数的位置?我的意思是我可以拥有另一个名为C类的类并符合Addition协议,现在我有两个符合Addition协议的类,B类如何知道去哪里?

谢谢!

1 个答案:

答案 0 :(得分:1)

当您拨打runAddition()B的方法时,它将不执行任何操作,因为delegate没有设置值。

要使其正常工作,您需要分配实现 Addition协议的任何类的实例。

比方说,我们有两个实现Addition协议的类:

class Calculator1: Addition {

    func addTwoNumbers(_ number1: Int, _ number2: Int) {
        print("Inside Calculator1 addTwoNumbers method")
        // The rest of your code
    }
}

class Calculator2: Addition {

    func addTwoNumbers(_ number1: Int, _ number2: Int) {
        print("Inside Calculator2 addTwoNumbers method")
        // The rest of your code
    }
}

现在,让我们创建以前类的2个对象:

let calculator1 = Calculator1()
let calculator2 = Calculator2()

让我们创建一个类B的实例:

let bob = B()

现在,让我们设置bob的委托并调用runAddition()方法:

bob.delegate = calculator1
bob.runAddition()

此处runAddition()的输出将为:

  

Inside Calculator1 addTwoNumbers方法

现在,让我们为委托设置另一个值,然后再次调用runAddition()

bob.delegate = calculator2
bob.runAddition()

此处runAddition()的输出将为:

  

Inside Calculator2 addTwoNumbers方法

希望这有帮助!