Swift инициализатор для публичного класса
При создании публичного класса необходимо ли делать указанный инициализатор общедоступным?
Какая разница между обнародованием и нет?
например
public class A {
init() {}
}
или же
public class A {
public init() {}
}
2 ответа
нет
Вам не нужно делать это публичным. На самом деле, вы можете сделать это частным. Единственное, что особенного в назначенном инициализаторе (и вашим классам разрешено более одного), это то, что они отвечают за обеспечение полной инициализации объекта.
Удобный инициализатор (инициализатор либо обозначен, либо удобен) (отмечен convenience
Ключевое слово) не несет этой ответственности. Удобный инициализатор сначала делегирует назначенному инициализатору, а затем возвращает его, ему предоставляется возможность перезаписать некоторые начальные значения. Важно отметить, что удобный инициализатор всегда должен "делегировать через". Он всегда должен вызывать другой инициализатор в классе.
Напротив, назначенный инициализатор (любой инициализатор, не помеченный convenience
Ключевое слово) должно нести ответственность за то, чтобы убедиться, что каждое свойство в классе получает действительное начальное значение, затем оно должно "делегировать" (вызывать инициализатор суперкласса, если есть суперкласс), затем оно может перезаписывать значения, если захочет.
Но ничто не мешает вам создать класс с ничего, кроме частных назначенных инициализаторов (вообще ничего).
Даже когда мы наследуем от класса с required
initializer, наш подкласс может просто реализовать этот инициализатор как удобный инициализатор.
class ParentClass {
let foo: Int
required init(foo: Int) {
self.foo = foo
}
}
class ChildClass: ParentClass {
let bar: Int
private init(foo: Int, bar: Int) {
self.bar = bar
super.init(foo: foo)
}
required convenience init(foo: Int) {
self.init(foo: foo, bar: foo)
}
}
Вышесказанное совершенно актуально для Swift.
ChildClass
имеет частный назначенный инициализатор. Он унаследовал от родительского класса с обязательным инициализатором, но он реализовал этот инициализатор как удобный инициализатор. (Более того, в отличие от вашей гипотезы в комментарии здесь и вопрос, где, required
инициализатор на самом деле не должен быть public
обязательно... контекст имеет значение, и, возможно, я остановлюсь на этом в ответе на ваш другой вопрос.)
Более того, в отличие от ответа subjective_c, вам не нужно создавать части вашего кода Swift. public
чтобы использовать этот код из Objective-C, и отрывок из Apple, который он процитировал в своем ответе, фактически указывает на это. Вам нужно только пометить общедоступные вещи, которые вы хотите быть доступными, за рамками, в которых был реализован ваш код. Вы можете поместить код Objective-C и Swift в одно и то же приложение, и код Objective-C может видеть все, что помечено как public
или же internal
,
Вам не нужно делать это общедоступным, если только вы не делаете его доступным в качестве основы для использования в Objective-C.
Смотрите: https://developer.apple.com/swift/blog/?id=5
При смешивании Objective-C и Swift, поскольку сгенерированный заголовок для платформы является частью открытого интерфейса Objective-C платформы, в сгенерированном заголовке для платформы Swift появляются только объявления, помеченные как public.