Закрытия
Я не знаю вашего точного использования, но один из способов - использовать замыкания вместо протоколов.Создайте переменную замыкания внутри первого класса и затем вызывайте ее после того, как значение будет возвращено
class FirstClass {
var valueReturned: ((Int)->Void)?
func returnInt() -> Int {
let value = 42
valueReturned?(value)
return value
}
}
, а затем где-нибудь, где у вас есть ссылки для обоих экземпляров обоих классов, установите сначала valueReturned
, а внутри замыкания произнесите, что когда это будет вызвано, вы хотите вызвать printInt(myInt:)
секунд и в качестве значения параметра передать из замыкания
firstClass.valueReturned = { value in // assign parameter of closure
self.secondClass.printInt(myInt: value)
// self.printInt(myInt: value)
}
Делегат Патерн
В любом случае, если вы хотите использовать протоколы, вам понадобитсяпаттерн делегата.
Начните с объявления протокола
protocol FirstClassDelegate: class {
func printInt(myInt: Int)
}
, а затем создайте переменную делегата внутри первого класса и вызовите метод для делегата после того, как значение должно быть возвращено
class FirstClass {
weak var delegate: FirstClassDelegate?
func returnInt() -> Int {
let value = 42
delegate?.printInt(myInt: value)
return value
}
}
Сейчасреализовать этот протокол делегата для второго класса и установить свойство delegate
некоторого экземпляра первого класса как self
class SecondClass {
var firstClass = FirstClass()
init() {
firstClass.delegate = self
}
}
extension SecondClass: FirstClassDelegate {
func printInt(myInt: Int) {
print(myInt)
}
}