Рассмотрим следующий класс (одинаково применимый и к структуре) в модуле:
public class Foo {
public func bar() {
// method body
}
}
Обратите внимание, что он не имеет явного инициализатора; этот пример не требует специальной инициализации. Этот класс будет доступен для других модулей, поскольку он помечен как public
. Однако, когда код за пределами модуля пытается инициализировать его, компилятор жалуется:
let foo = Foo() // 'Foo' initializer is inaccessible due to 'internal' protection level
Чтобы удовлетворить компилятор, я должен определить явный пустой инициализатор, отмеченный public
:
public class Foo {
public init() {
// This initializer intentionally left empty
}
public func bar() {
// do something useful
}
}
Почему, если класс явно public
, мне нужно явно определить публичный инициализатор? Должен ли он неявно иметь открытый инициализатор?
Существует связанный с этим вопрос , относящийся к модульному тестированию, но я нахожу, что он действительно не входит в суть философии дизайна того, что я нахожу для быть удивительной проблемой.