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.

Другие вопросы по тегам