В чем преимущество использования делегата для передачи значений между viewControllers? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть два viewControllers, vcA и vcB.Когда я хочу передать значения в vcA из vcB, я использую делегат следующим образом:

//vcB.swift
protocol TransferDelegate {
    func transferValue(msg: String)
}

var delegate: TransferDelegate!

//vcA.swift
class vcA: UIViewController {
}

extension vcA: TransferDelegate {
    func transferValue(msg: String){
        //xxxxxxx
  }
}

Когда vcA push vcB, тогда vcb.delegate = self

Когда vcB хочет передать значения, тогда delegate.transferValue(msg)

Мой вопрос заключается в том, что если я перенесу экземпляр vcA self в vcB вместо установленного делегата следующим образом:

//vcB.swift
class vcB: UIViewController {
    var vca: vcA!

    func transferValues(msg: String) {
        vca.msg = msg
    }
}

//vcA.swift
vcb.vca = self

Я пробовал оба эти метода, оба они могут работать.

Так почему же мы используем первый метод, а не второй?

В чем разница между ними или в чем преимущество делегата?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Преимущество использования делегата заключается в том, что vcB не имеет (или не нуждается) в каких-либо знаниях конкретного типа объекта, действующего в качестве делегата.А это, в свою очередь, значительно упрощает использование vcB более чем vcA.Это делает ваши классы менее связанными и намного более гибкими.

Представьте себе, что UITableView работает только с определенным типом источника данных и делегата, вместо того, чтобы допускать, чтобы все, что соответствует надлежащим протоколам, действовало как данныеисточник и делегат.Это ничем не отличается.

0 голосов
/ 08 июня 2018

Смотрите, когда вы используете делегата, вы можете получить доступ только к этому конкретному методу этого конкретного viewController.Но если вы сохраните весь экземпляр в vc2, вы сможете получить доступ или изменить любые свойства или функции этого класса.Может быть, вы не хотите, чтобы доступ к vc2.

0 голосов
/ 08 июня 2018
protocol TransferDelegate {
    func transferValue(msg: String)
}

Хорошо, что вы можете повторно использовать этот метод делегата в других vcs.Теперь у вас есть vcA и vcB, чтобы делать вещи.Возможно, в будущем вам понадобится нечто подобное в других vcs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...