Ответ 1
Маркировка класса public необязательно подразумевает, что разработчик хочет, чтобы класс был инициализирован публично. Например, я часто пишу базовые классы, которые существуют исключительно для меня, чтобы иметь возможность подклассифицировать их. Я передаю эти суперклассы internal
инициализаторы, чтобы их подклассы могли обращаться к ним, но те, которые находятся во внешнем мире, не должны использовать их напрямую. Например, Operation
в Foundation
не имеет доступных инициализаторов, но класс является общедоступным. Он просто предназначен для подкласса. Это считается абстрактным классом в Objective-C.
Поскольку Swift не содержит явной поддержки абстрактных классов, действие создания класса public, но без публичных инициализаторов в основном служит абстрактным классом (за исключением того, что каждая функция должна по-прежнему иметь определение по умолчанию либо в самом классе, либо в каком-либо расширение протокола).
Имея это в виду, вот некоторые правила Swift:
- Если ваш класс помечен как
private
, все переменные, inits и функции будут по умолчанию равныprivate
. - Если ваш класс отмечен
internal
(который по умолчанию),public
илиopen
, все переменные, inits и функции будут по умолчанию равныinternal
. - Суперкласс класса должен быть как минимум доступным.
- классы и члены класса, объявленные
public
в Objective-C, импортируются в Swift какopen
из-за отсутствия такого различия в Objective-C.
Этот второй - тот, с которым вы работаете. По умолчанию init выбирает значение по умолчанию internal
, потому что последнее, что хочет сделать Swift, - это открыть ваш init как открытый API, если это явно не указано.
Примечание. В моих тестах (по крайней мере, на детской площадке) кажется, что с введением fileprivate
:
- Если класс объявлен
private
илиfileprivate
, кажется, что члены класса по умолчанию равныfileprivate
, если явно не аннотацияprivate
.