Swift 2 внутренний и частный
Я запутался в модификаторе внутреннего и закрытого доступа.
В документах говорится:
"Внутренний доступ позволяет сущности использоваться в любом исходном файле от их определяющего модуля, но не в каком-либо исходном файле за пределами этого модуль. Обычно вы используете внутренний доступ при определении приложений или структуры внутренней структуры."
Как я думал, это было так, что с внутренним вы можете получить доступ ко всему, если находитесь в своем приложении. Но это не так, потому что, когда у меня есть viewcontroller, что является внутренним по умолчанию, и у меня есть внутренняя функция на этом контролере просмотров, я не могу получить доступ к этому из другого файла в другой группе (вы создаете их в xCode).
То, что я попробовал, имело ViewController, у которого есть метод foo в группе A, а затем в группе B я создал ViewController следующим образом:
let vc: FakeViewController = FakeViewController()
vc.foo()
Таким образом, внутренняя граница ограничена одной и той же группой? Или я интерпретирую это неправильно?
Полезно ли, что в viewcontroller вы создаете частные методы и vars/let?
Ответы
Ответ 1
Внутренний доступ ограничивает доступ к файлам в единственном приложении или структуре.
Частный ограничивает доступ к отдельному исходному файлу, в котором создан ваш объект.
См. ссылку для более подробного объяснения.
В целом, если ваши "группы A" и "группа B" находятся в одном приложении или в рамках структуры, вы должны иметь доступ к методам от каждого, предполагая, что viewController разрешает внутренний доступ.
Ответ 2
Предположим, что у вас есть 3 разных файла с исходным кодом контроллера A, B, C
тогда
В приватном режиме: - Если в закрыты узлы A, а не A, могут использовать их
In Internal: - IF A является таким же внутренним, как B, а C может легко их использовать.
Вот пример:
![введите описание изображения здесь]()
Спасибо
Ответ 3
Я понимаю, что private не позволит доступ к переменной из-за пределов этого класса. Однако бывают моменты, например, с распознавателями жестов, вы не можете сделать их частными, потому что они необходимы за кулисами. Маркировка их как "внутренних" позволяет им получать доступ из других функций, но не вызывается напрямую.
В основном я использую внутреннее, чтобы мой код был организован, поэтому я знаю, что это не общедоступная функция, но она все еще может быть использована.
Ответ 4
@user1007522 Не могли бы вы опубликовать весь исходный код для FakeViewController? У вас должен быть доступ к foo() из переменной vc. Если вы этого не сделаете, я подозреваю, что здесь есть что-то другое.
Я понял, что следующие определения намного легче понять (скопировано из UseYourLoaf - Swift 4 уровня доступа)
Пять уровней доступа Swift 3/4
Swift 3 имеет пять уровней доступа, которые управляют из какого исходного файла или модуля вы можете получить доступ к чему-либо. В порядке от большинства открытых до самых ограниченных:
-
открыть, вы можете получить доступ к открытым классам и членам класса из любого исходного файла в определяющем модуле или любом модуле, который импортирует этот модуль. Вы можете подклассифицировать открытый класс или переопределить открытый член класса как в своем определяющем модуле, так и в любом модуле, который импортирует этот модуль.
-
public позволяет использовать тот же доступ как открытый - любой исходный файл в любом модуле, но имеет более ограничительное подклассов и переопределение. Вы можете подклассифицировать открытый класс только в том же модуле. Публичный член класса может быть переопределен только подклассами в том же модуле. Это важно, если вы пишете фреймворк. Если вы хотите, чтобы пользователь этой структуры мог подклассифицировать класс или переопределить метод, вы должны открыть его.
-
внутренний позволяет использовать любой исходный файл в определяющем модуле, но не снаружи этого модуля. Обычно это уровень доступа по умолчанию.
-
fileprivate позволяет использовать только в определяющем исходном файле.
-
закрытый Swift 4: позволяет использовать только из объявляющего объявления и нового в Swift 4 для любых расширений этого объявления в том же исходном файле Swift 3: позволяет использовать только из прилагаемого декларация.