Как заставить функцию вызываться только конкретным классом в swift? - PullRequest
1 голос
/ 20 марта 2019

У меня есть две платформы A и B. У меня есть открытая функция внутри B, называемая getMap (), которая возвращает копию карты (которая является частной переменной в B).Поэтому я вызываю getMap () в A, чтобы получить это значение.Это нормально, потому что это копия, поэтому, что бы я ни делал с возвращаемым значением, оно не влияет на фактическую переменную внутри B.

Теперь я выполнил некоторую обработку этого значения, мне нужно передать его обратно B.Вот проблема: чтобы передать ее обратно, она должна быть публичной функцией, но я не хочу, чтобы другие платформы или приложения вызывали эту функцию, потому что только A должен вносить изменения в это значение карты.

Есть ли способ указать в B, что только если A вызывает функцию, тогда значение должно быть установлено, в противном случае игнорируется кто-либо еще, кто использует эту функцию?Я слышал, что вы можете использовать делегат / протокол для достижения этой цели, но я не понимаю.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Это невозможно из коробки. Если вы создаете Framework, вы должны решить, должен ли метод / класс быть публичным или нет. Если метод общедоступный, то нет готового решения, которое обеспечивает пуленепробиваемое решение, которое решает ваши требования. В конце концов, метод открыт для ВСЕХ потребителей Framework B.

Итак, вы в конечном итоге внедрите какие-то механизмы контроля доступа в Framework B. Это означает, что Framework A должна каким-то образом аутентифицировать себя (код доступа и т. Д.).

Шаблон delegate также не решит вашу проблему, поэтому он также должен быть общедоступным, чтобы Framework A мог его использовать. Однако, если она общедоступна, ее могут использовать все потребители Framework B.

0 голосов
/ 20 марта 2019

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

Вы бы создали протокол в рамках B следующим образом:

protocol FrameworkBDelegate {
     func sendMapChanges(map: Map)
}

Затем вызовите метод делегата, когда будете готовы, отправьте его обратно в другой фреймворк:

func changeMap() {
     var map = frameworkA.getMap()

     // Do stuff to map...

     delegate.sendMapChanges(map: map)
}

Я не хочу писать целый учебник о том, как реализовать делегирование, поэтому вот хороший пример от Swift от Sundell: здесь
Дайте мне знать, если вам нужна помощь.

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