internal swift что это

Swift 2 internal vs private

I’m confused about the internal and private access modifier.

“Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.”

How I thought it was, was that with internal you can access everything if you are in your own app. But this is not true, because when I have a viewcontroller what is default internal and I’m having a internal function on that viewcontroller I can’t access this from another file in another group (You create these in xCode).

What I tried was having a ViewController that has a method foo in group A then in group B I created a ViewController like this:

So is internal restricted to the same group? Or I’m I interpreting it wrong?

Is it useful that in a viewcontroller you create private methods and vars/lets?

4 Answers 4

@user1007522 Could you post the entire source code for FakeViewController? You should have access to foo() from your vc variable. If you do not, I suspect something else is in play here.

The Five Access Levels of Swift 3/4

Swift 3 has five access levels that control from which source file or module you can access something. In order from most open to most restricted:

open you can access open classes and class members from any source file in the defining module or any module that imports that module. You can subclass an open class or override an open class member both within their defining module and any module that imports that module.

internal allows use from any source file in the defining module but not from outside that module. This is generally the default access level.

fileprivate allows use only within the defining source file.

private Swift 4: allows use only from the enclosing declaration and new in Swift 4, to any extensions of that declaration in the same source file Swift 3: allows use only from the enclosing declaration.

Источник

Есть ли у Swift модификаторы доступа?

Я не нашел упоминания о модификаторах доступа в Swift reference. Можно ли ограничить видимость данных в Swift?

17 ответов

по состоянию на Swift 3.0.1, есть 4 уровня доступа, описанный ниже от самого высокого (наименее ограничительного) до самого низкого (наиболее ограничительного).

1. open и public

включить объект для использования вне определяющего модуля (целевого объекта). Вы обычно используете open или public доступ при указании открытого интерфейса к фреймворку.

2. internal

позволяет использовать объект в определяющем модуле (целевой объект). Вы обычно используете internal доступ при определении внутренней структуры приложения или фреймворка.

3. fileprivate

ограничивает использование entity к определяющему исходному файлу. Вы обычно используете fileprivate доступ, чтобы скрыть детали реализации определенной части функциональности, когда эти детали используются в пределах всего файла.

4. private

ограничивает использование сущности заключительным объявлением. Вы обычно используете private доступ, чтобы скрыть детали реализации определенной части функциональности, когда эти детали используются только в единая декларация.

когда говорят о создании «частного метода» в Swift или ObjC (или ruby или java или. ), эти методы не являются действительно частная. Вокруг них нет никакого контроля доступа. Любой язык, который предлагает даже небольшой самоанализ, позволяет разработчикам получать эти значения извне класса, если они действительно этого хотят.

Итак, то, о чем мы действительно говорим здесь,-это способ определить открытый интерфейс, который просто представлена функциональность, которую мы хотим чтобы, и «скрывает» остальное, что мы считаем «частным».

помните, что протоколы являются первоклассными типами и могут использоваться в любом месте типа. и, при использовании таким образом, они предоставляют только свои собственные интерфейсы, а не те из типа реализации.

таким образом, пока вы используете MyClass вместо MyClassImplementation в типы параметров и т. д. он должны все просто работать:

есть несколько случаев прямого назначения, когда вы должны быть явными с типом, а не полагаться на Swift, чтобы вывести его, но это вряд ли кажется прерывателем сделки:

использование протоколов таким образом является семантическим, достаточно кратким, и на мой взгляд, очень похоже на расширения класса, которые мы использовали для этой цели в ObjC.

насколько я могу судить, нет ключевых слов «public», «private» или «protected». Это предполагает, что все открыто.

однако Apple может ожидать, что люди будут использовать «протоколы» (называемые интерфейсами остальным миром) и дизайн завод шаблон чтобы скрыть детали реализации типа.

это часто хороший шаблон дизайна для использования в любом случае; как это позволяет изменить ваш реализация класс иерархия, сохраняя при этом логическое введите систему то же самое.

используя комбинацию протоколов, замыканий и вложенных/внутренних классов, можно использовать что-то по линиям шаблона модуля, чтобы скрыть информацию в Swift прямо сейчас. Это не очень чисто или приятно читать, но это работает.

innerVal и mysteriousMath скрыты здесь от внешнего использования, и попытка проникнуть в объект должна привести к ошибке.

Я только часть пути через мое чтение Swift docs поэтому, если здесь есть недостаток, пожалуйста, укажите это, хотелось бы знать.

Читайте также:  при опущении желудка какие симптомы

Swift 4

согласно упомянутому в Swift Документация-Контроль Доступа, Swift 4 и 5 Управление Доступом:

открыть и общественные: можно получить доступ из сущностей их модуля и сущностей любого модуля, который импортирует определяющий модуль.

внутренние: может только быть доступ из сущностей их модуля. Это уровень доступа по умолчанию.

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

в чем разница между открыть и public?

открыть это то же самое, что и public в предыдущие версии Swift, они позволяют классам из других модулей использовать и наследовать их, i.e: они могут быть подклассами из других модулей. Кроме того, они позволяют членам из других модулей использовать и переопределять их. Та же логика относится и к их модулям.

общественные разрешить классам из другого модуля использовать их, но не чтобы унаследовать их, я.e: они не может быть подклассом из других модулей. Кроме того, они позволяют членам из других модулей использовать их, но не для того, чтобы обойти. Для своих модулей они имеют одинаковую логику open (они позволяют классам использовать и наследовать их; они позволяют членам использовать и переопределять их).

в чем разница между fileprivate и частная?

fileprivate можно получить доступ из всех своих файлов.

частная можно получить доступ только из их одного объявления и к расширения этого объявления, которые находятся в том же файле; например:

каковы различия между Swift 3 и Swift 4 контроля доступа?

как говорится в предложение SE-0169, единственное уточнение было добавлено к Swift 4, что частная область контроля доступа была расширена, чтобы быть доступной из расширения этой декларации в том же файл; например:

итак, нет необходимости объявлять myMessage as fileprivate чтобы быть доступным во всем файле.

боковая панель Примечание: Если вы столкнулись с проблемами, связанными с не компиляцией Swift 4 с мигрировали старый проект Swift 3, Вы можете проверить это Q & A.

начиная с Xcode 6 beta 4, Swift имеет модификаторы доступа. Из примечаний к выпуску:

Swift access control имеет три уровня доступа:

Swift 3.0 обеспечивает пять различных элементов управления доступом:

открыть открыть и public access позволяет использовать сущности в любом исходном файле из их определяющего модуля, а также в исходный файл из другого модуля, импортирующего определяющий модуль. Вы обычно используют открытые или публичный доступ при указании public интерфейс к фреймворку.

внутренние access позволяет сущностям использоваться в любом исходном файле из их определяющего модуля, но не в любом исходном файле вне этого модуль. Обычно при определении приложения или приложения используется внутренний доступ внутренняя структура фреймворка.

File-private access ограничивает использование сущности собственным исходным файлом определения. Использовать файл-Частный доступ чтобы скрыть детали реализации определенной части функциональности, когда те детали используются в пределах всего файла.

частная access ограничивает использование сущности вложенным объявлением. Используйте Частный доступ, чтобы скрыть детали реализации определенная часть функциональности, когда эти детали используются только в рамках одной декларации.

открыть доступ является самым высоким (наименее ограничительных) уровень доступа и частная доступ является самым низким (наиболее ограничительного) уровня доступа.

Уровни Доступа По Умолчанию

все сущности в коде (за некоторыми исключениями) имеют внутренний уровень доступа по умолчанию, если вы сами не задаете явный уровень доступа. В результате во многих случаях нет необходимости указывать явный уровень доступа в коде.

примечание к выпуску тема:

классы, объявленные как public, больше не могут быть подклассами вне их определяющий модуль и методы, объявленные как public, больше не могут быть переопределено вне их определяющего модуля. Разрешить классу быть внешний подкласс или метод для внешнего переопределения, declare они как открытые, что является новым уровнем доступа за пределами общественности. Импортированный Классы и методы Objective-C теперь импортируются как открытые чем публично. Модульные тесты, которые импорт модуля с помощью импорта @testable для подкласса публичных или внутренних классов как переопределить общедоступные или внутренние методы. (SE-0117)

нет, это невозможно. Нет никаких частных / защищенных методов и переменных вообще.

в бета-версии 6 в документации указано, что существует три разных модификатора доступа:

и эти три применяются к классам, протоколам, функциям и свойствам.

для получения дополнительной информации проверьте Контроль Доступа.

механизмы управления доступом, как введено в Xcode 6:

Swift предоставляет три разных уровня доступа для сущностей в вашем коде. Эти уровни доступа относятся к исходному файлу, в котором определена сущность, а также к модулю, к которому принадлежит исходный файл.

публичный доступ-это самый высокий (наименее ограничительный) уровень доступа, а частный доступ-самый низкий (или самый ограничительный) уровень доступа.

по умолчанию accecss это внутренние, и как таковой не нужно указывать. Также обратите внимание, что частная описатель делает не работа над классом уровень, но на уровне исходного файла. Это означает, что для того, чтобы получить части класса действительно частные, вам нужно разделиться на собственный файл. Это также вводит некоторые интересные случаи в отношении модульного тестирования.

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

этот последний бит также влияет на функции, кортежи и конечно, другие вещи в том, что если т. е. функция использует частная класс, тогда недопустимо иметь функцию внутренние или общественные, так как у них нет доступа к частная класса. Это приводит к предупреждению компилятора, и вам нужно повторно объявить функцию как частная

Теперь в бета-версии 4 они добавили модификаторы доступа к Swift.

Swift access control имеет три уровня доступа:

по умолчанию большинство сущностей в исходном файле имеют внутренний доступ. Это позволяет разработчикам приложений в значительной степени игнорировать контроль доступа, позволяя разработчикам framework полный контроль над в API фреймворка.

Читайте также:  axios react что это

на язык грамматика не имеет ключевых слов «public», «private» или «protected». Это предполагает, что все открыто. Конечно, может быть какой-то альтернативный метод указания модификаторов доступа без этих ключевых слов, но я не мог найти его в языковой ссылке.

Swift 3 и 4 принес немало изменений и для уровней доступа переменных и методов. Swift 3 и 4 теперь имеет 4 различных уровня доступа, где открыть/общественная доступ является самым высоким (наименее ограничительного) уровня доступа и частная доступ является самым низким (наиболее строгие) уровень доступа:

интересно:

Это может быть хорошей идеей, чтобы получить лучший поддерживаемый код. И вы можете легко переключиться (например, для модульного тестирования) на non-private, просто изменив одно слово.

надеюсь, чтобы сэкономить время для тех, кто хочет что-то сродни защищенным методам:

согласно другим ответам, swift теперь предоставляет модификатор «private», который определяется по файлу, а не по классу, например, в Java или C#. Это означает, что если вам нужны защищенные методы, вы можете сделать это с помощью swift private methods если они находятся в одном файле

Источник

Документация

Контроль доступа

Контроль доступа

Контроль доступа ограничивает доступ к частям вашего кода из кода других исходных файлов и модулей. Эта особенность позволяет вам прятать детали реализации вашего кода и указывать на предпочтительный интерфейс, через который можно получить доступ к вашему коду.

Вы можете присвоить определенные уровни доступа как к индивидуальным типам (классы, структуры и перечисления), так и к свойствам, методам, инициализаторам и сабскриптам, принадлежащим этим типам. Протоколы могут быть ограничены в определенном контексте, так же как могут быть ограничены глобальные переменные или функции.

В дополнение к предложению контроля различных уровней доступа, Swift уменьшает необходимость указания явного уровня контроля доступа тем, что сам обеспечивает уровни доступа по умолчанию для типичных сценариев. И на самом деле, если вы пишете простое приложение, то вам может и не понадобится указывать явно уровень контроля доступа вообще.

Заметка

Различные аспекты вашего кода, к которым применим контроль уровня доступа (свойства, типы, функции и т.д.) будем называть “сущности”, для краткости.

Модули и исходные файлы

Модель контроля доступа Swift основывается на концепции модулей и исходных файлов.

Каждый таргет сборки (например, бандл приложения или фреймворк) в Xcode обрабатывается как отдельный модуль. Если вы объедините вместе аспекты кода вашего приложения в качестве отдельного фреймворка, то их возможно будет инкапсулировать и использовать заново во множестве других приложений. Таким образом, все, что вы определите в рамках этого фреймворка будет считаться частью отдельного модуля, когда это будет импортировано и использовано внутри приложения, или когда это будет использовано внутри другого фреймворка.

Уровни доступа

Swift предлагает пять различных уровней доступа для объектов вашего кода. Эти уровни доступа относительны исходному файлу, в котором определен объект, и так же они относительны модулю, которому принадлежит исходный файл:

Открытый доступ применяется только к классам и членам класса и отличается от public доступа следующим:

Руководящий принцип по выбору уровня доступа

Уровни доступа в Swift следуют общему руководящему принципу: никакой объект не может быть определен в пределах другого объекта, который имеет более низкий (более строгий) уровень доступа.

Более глубокий смысл данного руководящего принципа для различных аспектов раскрывается ниже.

Дефолтный уровень доступа

Уровень доступа для простых однозадачных приложений

Уровень доступа для фреймворка

Заметка

Уровни доступа для модуля поэлементного тестирования (unit test target)

Когда вы пишете приложение с модулем поэлементного тестирования, то код вашего приложения должен быть доступным для модуля, чтобы он мог его проверить. По умолчанию только сущности с маркировкой public могут быть доступны для других модулей, однако этот модуль может получить доступ ко всем внутренним сущностям, если вы поставили входную маркировку объявления модуля продукта как @testable и компилируете со включенным режимом тестирования.

Синтаксис контроля доступа

Если вы не укажете уровень доступа, то он будет internal по умолчанию, о чем было поведано в главе Уровни доступа. Это значит, что SomeInternalClass и someInternalConstant могут быть записаны без явного указания модификатора уровня доступа, и они все равно будут все еще иметь internal уровень доступа:

Пользовательские типы

Заметка

Кортежи типов

Заметка

Кортежи типов не имеют отдельного определения в отличии от классов, структур, перечислений или функций. Уровень доступа кортежей типов вычисляется автоматически, когда используется кортеж, и не может быть указан явно.

Типы функций

Уровень доступа для типов функции вычисляется как самый строгий уровень доступа из типов параметров функции и типа возвращаемого значения. Вы должны указывать уровень доступа явно как часть определения функции, если вычисляемый уровень доступа функции не соответствует контекстному по умолчанию.

Типы перечислений

Каждый кейс в перечислении автоматически получает тот же уровень доступа, что и само перечисление. Вы не можете указать другой уровень доступа для какого-то определенного кейса перечисления.

Читайте также:  при какой скорости включать 5 передачу на калине

Исходные значения и связанные значения

Типы, используемые для любых начальных значений или связанных значений в перечислении, должны иметь как минимум такой же высокий уровень доступа как и перечисление. Вы не можете использовать тип private для типа исходного значения перечисления, которое имеет internal уровень доступа.

Вложенные типы

Уровень доступа класса и подкласса

В дополнение вы можете переопределить любой член класса (метод, свойство, инициализатор или сабскрипт), который будет виден в определенном контексте доступа.

Константы, переменные, свойства и сабскрипт

Константы, переменные, свойства не могут быть более открытыми, чем их тип. Это не правильно писать свойство public для private типа. Аналогично дело обстоит и с сабскриптом: сабскрипт не может быть более открытым, чем тип индекса или возвращаемый тип.

Геттеры и сеттеры

Геттеры и сеттеры для констант, переменных и сабскриптов автоматически получают тот же уровень доступа как и константа, переменная, свойство или сабскрипт, которому они принадлежат.

Заметка

Если вы создаете экземпляр TrackedString и изменяете его строковое значение несколько раз, то вы можете увидеть, что свойство numberOfEdits изменяется, чтобы соответствовать количеству фактических изменений значения:

Инициализаторы

Пользовательским инициализаторам может быть присвоен уровень доступа ниже или равный уровню доступа самого типа, который они инициализируют. Единственное исключение составляют Требуемые инициализаторы. Требуемый инициализатор должен иметь тот же уровень доступа как и класс, которому он принадлежит.

Что же касается параметров функций и методов, типов параметров инициализатора, то они не могут быть более частными, чем собственный уровень доступа инициализатора.

Дефолтные инициализаторы

Как было описано в главе Дефолтные инициализаторы, Swift автоматически предоставляет дефолтный инициализатор, который не имеет никаких аргументов, для любой структуры или базового класса, который предоставляет значения по умолчанию для всех своих свойств и который не имеет ни одного собственного инициализатора.

Дефолтные почленные инициализаторы для типов структур

Как и с дефолтным инициализатором выше, если вы хотите открытый тип структуры, который может быть инициализирован при помощи почленного инициализатора, когда используется в другом модуле, то вы должны предоставить открытый почленный инициализатор самостоятельно, как часть определения типа.

Протоколы и уровень доступа

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

Уровень доступа каждого требования в процессе определения протокола устанавливается на тот же уровень, что и сам протокол. Вы не можете установить уровень доступа требований протокола отличным от того, который поддерживает сам протокол. Это гарантирует, что все требования протокола будут видимы любому типу, который принимает протокол.

Заметка

Если вы определяете public протокол, то требования протокола требуют public уровня доступа для тех требований, которые они реализуют. Это поведение отличается от поведений других типов, где определение открытого типа предполагает наличие уровня internal у элементов этого типа.

Наследование протокола

Если вы определяете новый протокол, который наследует из другого существующего протокола, то новый протокол может иметь уровень доступа не выше чем протокол, который он наследует. Вы не можете писать public протокол, который наследует из internal протокола, к примеру.

Соответствие протоколу

Тип может соответствовать протоколу с более низким уровнем доступа, чем сам тип. Например, вы можете определить public тип, который может быть использован в других модулях, но чье соответствие внутреннему протоколу может быть использовано только внутри модуля, где определен сам internal протокол.

Заметка

В Swift как и в Objective-C соответствие протоколу является глобальным. И тип не может соответствовать протоколу двумя разными способами в пределах одной программы.

Расширения и уровни доступа

Аналогично вы можете отметить расширение, явно указав модификатор уровня доступа (например, private extension ), для того чтобы указать новый дефолтный уровень доступа, который будут иметь элементы, определенные в этом расширении. Этот новый уровень доступа может быть переопределен для отдельных элементов расширением.

Вы не можете предоставлять явный модификатор уровня доступа для расширения, если вы используете расширение для добавления соответствия протоколу. Вместо этого, собственный уровень доступа протокола используется для предоставления дефолтного уровня доступа для каждой реализации требования протокола внутри расширения.

Private свойства и методы в расширениях

Расширения, которые находятся в том же файле, что и сам класс/структура/перечисление, который(ую/ое) они расширяют, ведут себя точно так, как будто они являются частью расширяемого типа. И в результате вы можете:

Это поведение означает, что вы можете использовать расширения для организации вашего кода, независимо от того, имеют ли ваши типы приватные члены или нет. Например, нам дан вот такой простой протокол:

Вы можете использовать расширение, чтобы реализовать требование протокола:

Универсальные шаблоны. Алиасы типов

Уровень доступа для универсального типа или универсальной функции вычисляется как минимальный уровень доступа универсального типа или самой функции и уровень доступа ограничений любого типа ограничений для параметров типа.

Алиасы типов

Заметка

Это правило так же применимо для алиасов типа связанных типов, используемых для удовлетворения несоответствий протоколу.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Сказочный портал