В Objective-C данные экземпляра могут быть public
, protected
или private
. Например:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
Я не нашел упоминаний о модификаторах доступа в Swift. Можно ли ограничить видимость данных в Swift?
access-modifiers
swift
Герго Эрдоси
источник
источник
Ответы:
Начиная с Swift 3.0.1 , существует 4 уровня доступа , описанных ниже от самого высокого (наименее ограничительного) до самого низкого (наиболее ограничительного).
1.
open
иpublic
Разрешить использование сущности вне определяющего модуля (цели). Вы обычно используете
open
илиpublic
получаете доступ при указании открытого интерфейса к платформе.Однако
open
доступ применяется только к классам и членам класса , и он отличается отpublic
доступа следующим образом:public
классы и члены класса могут быть разделены на подклассы и переопределены только в определяющем модуле (цель).open
классы и члены класса могут быть разделены на подклассы и переопределены как внутри, так и вне определяющего модуля (цели).2.
internal
Позволяет использовать сущность внутри определяющего модуля (цели). Обычно вы используете
internal
доступ при определении внутренней структуры приложения или инфраструктуры.3.
fileprivate
Ограничивает использование сущности своим определяющим исходным файлом. Обычно вы используете
fileprivate
доступ, чтобы скрыть детали реализации определенной части функциональности, когда эти детали используются во всем файле.4.
private
Ограничивает использование объекта прилагаемой декларацией. Обычно вы используете
private
доступ, чтобы скрыть детали реализации определенной части функциональности, когда эти детали используются только в пределах одной декларации.источник
Свифт 4 / Свифт 5
Как указано в Документации Swift - Контроль доступа , Swift имеет 5 элементов управления доступом :
open и public : доступ к ним возможен из сущностей их модуля и из сущностей любого модуля, который импортирует определяющий модуль.
внутренняя : доступна только из сущностей их модуля. Это уровень доступа по умолчанию.
fileprivate и private : доступ к ним возможен только в ограниченной области, где вы их определяете.
В чем разница между открытым и публичным ?
open аналогичен public в предыдущих версиях Swift, они позволяют классам из других модулей использовать и наследовать их, то есть: они могут быть разделены на подклассы из других модулей. Кроме того, они позволяют членам из других модулей использовать и переопределять их. Та же логика распространяется и на их модули.
public позволяет классам из другого модуля использовать их, но не наследовать их, то есть: они не могут быть разделены на подклассы из других модулей. Кроме того, они позволяют членам из других модулей использовать их, но НЕ отменять их. Для своих модулей они имеют одинаковую логику открытия (они позволяют классам использовать и наследовать их; они позволяют членам использовать и переопределять их).
В чем разница между fileprivate и private ?
fileprivate может быть доступен из всех их файлов.
доступ к private возможен только из их единого объявления и расширений этого объявления, которые находятся в одном файле; Например:
Каковы различия между Swift 3 и Swift 4 Access Control?
Как упомянуто в предложении SE-0169 , единственное уточнение, которое было добавлено в Swift 4, заключается в том, что область частного управления доступом была расширена, чтобы быть доступной из расширений этого объявления в том же файле; Например:
Таким образом, нет необходимости объявлять
myMessage
как fileprivate доступным во всем файле.источник
Когда говорят о создании «частного метода» в Swift или ObjC (или ruby, java или…), эти методы на самом деле не являются частными. Там нет фактического контроля доступа вокруг них. Любой язык, который предлагает даже небольшой самоанализ, позволяет разработчикам получать эти значения извне класса, если они действительно этого хотят.
То, о чем мы на самом деле говорим, это способ определения общедоступного интерфейса, который просто представляет функциональность, к которой мы стремимся, и «скрывает» все остальное, что мы считаем «приватным».
Механизм Swift для объявления интерфейсов есть
protocol
, и его можно использовать для этой цели.Помните, что протоколы являются первоклассными типами и могут использоваться везде, где могут типы. И при использовании таким образом они предоставляют только свои собственные интерфейсы, а не интерфейсы реализующего типа.
Таким образом, до тех пор, пока вы используете
MyClass
вместоMyClassImplementation
типов параметров и т. Д., Все должно работать:Есть несколько случаев прямого присваивания, когда вы должны явно указывать тип, а не полагаться на Swift, чтобы вывести его, но это вряд ли нарушает условия:
Использование протоколов таким образом семантически, достаточно кратко и, на мой взгляд, очень похоже на расширения классов, которые мы использовали для этой цели в ObjC.
источник
Насколько я могу судить, здесь нет ключевых слов "public", "private" или "protected". Это предполагает, что все является публичным.
Однако Apple может ожидать, что люди будут использовать « протоколы » (называемые интерфейсами остальным миром) и шаблон фабричного проектирования, чтобы скрыть детали типа реализации.
Это часто хороший шаблон дизайна для использования в любом случае; поскольку это позволяет вам изменить иерархию классов реализации , сохраняя при этом систему логических типов.
источник
Используя комбинацию протоколов, замыканий и вложенных / внутренних классов, можно прямо сейчас использовать что-то в соответствии с шаблоном модуля, чтобы скрыть информацию в Swift. Это не супер чистый или приятно читать, но это работает.
Пример:
innerVal и mysteriousMath скрыты здесь от постороннего использования, и попытка проникнуть внутрь объекта может привести к ошибке.
Я только в процессе чтения документов Swift, поэтому, если здесь есть какой-то недостаток, пожалуйста, укажите на это, и я хотел бы знать.
источник
reflect(h)[0].1.value // 19
Начиная с Xcode 6 beta 4, Swift имеет модификаторы доступа. Из примечаний к выпуску:
Неявное значение по умолчанию - это то
internal
, что в пределах цели приложения вы можете оставить модификаторы доступа отключенными, кроме случаев, когда вы хотите быть более строгими. В целевом фреймворке (например, если вы встраиваете фреймворк для обмена кодом между приложением и общим представлением или расширением представления Today), используйтеpublic
для обозначения API, который вы хотите предоставить клиентам вашей фреймворка.источник
Swift 3.0 предоставляет пять различных средств управления доступом:
Уровни доступа по умолчанию
Все сущности в вашем коде (за некоторыми исключениями) имеют уровень доступа по умолчанию внутренний, если вы сами не указали явный уровень доступа. В результате во многих случаях вам не нужно указывать явный уровень доступа в вашем коде.
Информация о выпуске по теме:
Больше информации и подробностей: Язык программирования Swift (Контроль доступа)
источник
В Beta 6 документация утверждает, что есть три различных модификатора доступа:
И эти три относятся к классам, протоколам, функциям и свойствам.
Для получения дополнительной информации проверьте Контроль доступа .
источник
Теперь в бета-версии 4 они добавили модификаторы доступа в Swift.
из XCode 6 бета 4 Realese отмечает :
источник
Механизмы контроля доступа, представленные в Xcode 6 :
По умолчанию принимает это внутреннее , и делает так, что не нужно указывать. Также обратите внимание, что частный спецификатор не на уровне класса, а на уровне исходного файла. Это означает, что для того, чтобы части класса были действительно приватными, вам нужно разделить их на отдельный файл. Это также представляет некоторые интересные случаи, касающиеся модульного тестирования ...
Еще одно замечание, о котором я упоминал в приведенной выше ссылке, заключается в том, что вы не можете «обновить» уровень доступа. Если вы что-то делите на подклассы, вы можете ограничить это больше, но не наоборот.
Этот последний бит также влияет на функции, кортежи и, конечно, на другие вещи таким образом, что если, например, функция использует закрытый класс, то недопустимо иметь функцию внутреннюю или открытую , поскольку они могут не иметь доступа к закрытому классу. Это приводит к предупреждению компилятора, и вам нужно переопределить функцию как частную функцию.
источник
Swift 3 и 4 принесли много изменений и для уровней доступа к переменным и методам. Swift 3 и 4 теперь имеют 4 различных уровня доступа, где открытый / публичный доступ - самый высокий (наименее ограничивающий) уровень доступа, а частный доступ - самый низкий (наиболее ограничивающий) уровень доступа:
Интересный:
Вместо того, чтобы отмечать каждый отдельный метод или элемент как «закрытый», вы можете покрыть некоторые методы (например, обычно вспомогательные функции) в расширении класса / структуры и пометить все расширение как «Частное».
Это может быть хорошей идеей, чтобы получить лучший обслуживаемый код. И вы можете легко переключиться (например, для модульного тестирования) на не приватное, просто изменив одно слово.
Документация Apple
источник
Для Свифта 1-3:
Нет, это невозможно. Нет никаких частных / защищенных методов и переменных вообще.
Все публично.
Обновление После Swift 4 возможно увидеть другие ответы в этой теме
источник
Один из вариантов, который вы можете использовать, - это обернуть создание экземпляра в функцию и предоставить соответствующие методы получения и установки в конструкторе:
источник
Грамматика языка не имеет ключевые слова «общественности», «частные» или «защищенные». Это предполагает, что все является публичным. Конечно, мог бы быть какой-то альтернативный метод указания модификаторов доступа без этих ключевых слов, но я не смог найти его в справочнике по языку.
источник
Надеемся сэкономить время для тех, кто хочет что-то похожее на защищенные методы:
Как и в других ответах, swift теперь предоставляет модификатор «private», который определяется по файлам, а не по классам, как, например, в Java или C #. Это означает, что если вам нужны защищенные методы, вы можете сделать это с помощью быстрых приватных методов, если они находятся в одном файле.
например, Файл 1:
Файл 2:
}
источник
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
НАЧАЛЬНЫЙ SWIFT 2.2;)
По умолчанию внутренний
источник
до swift 2.0 было только три уровня доступа [открытый, внутренний, приватный], но в swift 3.0 apple добавили два новых уровня доступа: [Open, fileType], так что теперь в swift 3.0 есть 5 уровней доступа. Здесь я хочу очистить роль из этих двух уровней доступа 1. Открытый: это очень похоже на Public, но единственное отличие состоит в том, что Public может получить доступ к подклассу и переопределить, а уровень Open access не может получить доступ к тому, что это изображение взято с сайта Medium, и это описывает разницу между открытым и публичным доступом
Теперь перейдем ко второму новому уровню доступа 2. filetype - это более крупная версия приватного или меньшего уровня доступа, чем внутренний. FileType может получить доступ к расширенной части [class, struct, enum], а приватный не может получить доступ к расширенной части кода, к которой он может получить доступ только лексическая область действия этого изображения взята с веб-сайта Medium и описывает разницу между fileType и уровнем частного доступа
источник