Создать протокол, используя два класса - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два класса, что-то вроде этого

class FirstClass {</p>

<code>   func returnInt() -> Int {
       return (42)
   }
}

class SecondClass {

   func printInt(myInt: Int) {
    print(myInt)
   }
} 
</code>

Я хотел бы знать, возможно ли создать протокол, когда функция "returnInt () -> Int "из FirstClass - это вызов, поэтому функция второго класса" printInt (Int) "- это вызов.

На самом деле, я работаю над сериализацией / десериализацией пакета из разных классов.

Я думаю, это лучший способ для этого, поэтому мне нужна ваша помощь.

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Во втором классе инициализируйте ваш класс с помощью:

init(fromFirstClass returnInt: Int) {
    ....
}
0 голосов
/ 05 февраля 2019

Это должно сделать это:

class FirstClass {

    weak var firstClassToSecondClassCommunicatorDelegate: FirstClassToSecondClassCommunicator?

    func returnInt() -> Int {
        let myInt = 42
        if firstClassToSecondClassCommunicatorDelegate != nil {
            firstClassToSecondClassCommunicatorDelegate?.printInt(myInt: myInt)
        }
        return myInt
    }
}

class SecondClass: FirstClassToSecondClassCommunicator {
    func printInt(myInt: Int) {
        print(myInt)
    }
}

class myVC: UIViewController {
    override func viewDidLoad() {
        let firstClass = FirstClass()
        let secondClass = SecondClass()
        firstClass.firstClassToSecondClassCommunicatorDelegate = secondClass
    }
}

protocol FirstClassToSecondClassCommunicator {
    func printInt(myInt: Int)
}
0 голосов
/ 05 февраля 2019

Закрытия

Я не знаю вашего точного использования, но один из способов - использовать замыкания вместо протоколов.Создайте переменную замыкания внутри первого класса и затем вызывайте ее после того, как значение будет возвращено

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)
    }
}
...