Как я могу опубликовать по умолчанию членский инициализатор для структур в Swift?

У меня есть быстрая структура, которая определяет структуру:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

Однако я не могу использовать неявный член мудрый инициализатор из другого проекта, который импортирует библиотеку. Ошибка "CollectionTO" не может быть инициализирована, потому что у нее нет доступных инициализаторов. то есть это не дает ключевому инициатору инициализатора по умолчанию неявного члена публичное ключевое слово.

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

Мне нужно добавить свой собственный метод init так:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}

... но я бы предпочел, если есть другой способ, который кто-либо знает?

Ответ 1

Цитирую руководство:

"Поэлементные инициализаторы по умолчанию для типов структуры Поэлементный инициализатор по умолчанию для типа структуры считается закрытым, если какие-либо из хранимых свойств структур являются закрытыми. В противном случае инициализатор имеет внутренний уровень доступа.

Как и в случае с инициализатором по умолчанию, описанным выше, если вы хотите, чтобы публичный тип структуры мог инициализироваться с помощью членного инициализатора при использовании в другом модуле, вы должны сами предоставить общедоступный инициализатор как часть определения типов. "

Отрывок из "Языка программирования Swift", раздел "Контроль доступа".

Ответ 2

Несмотря на то, что по крайней мере невозможно иметь элементный инициализатор по умолчанию, вы можете сделать его быстро, выполнив следующие шаги:

  1. Сделайте объект временно классом вместо структуры
  2. Сохранить
  3. Щелкните правой кнопкой мыши имя класса и выберите refactor → Generate Memberwise Initializer.
  4. Измените его обратно на структуру

Ответ 3

Пока Apple не изменит это и не сделает его менее раздражающим, вы можете использовать https://github.com/Bouke/SwiftInitializerGenerator (или любую другую) эту вещь для создания публичных инициализаторов. Так будет меньше работы. Пробовал это, и это работает. Xcode Version 10.0, High Sierra 10.13.6

Ответ 4

Теперь у нас есть рубиновый гем 💎 для построчной обработки полного файла модели данных swift и добавления модификаторов общедоступного доступа, общедоступных инициализаторов по умолчанию для членов и других вещей в отдельный автоматически генерируемый выходной файл swift.

Этот драгоценный камень называется swift_republic

Пожалуйста, ознакомьтесь со следующей документацией для запуска этого драгоценного камня:

https://github.com/mehul90/swift_republic