Как я могу опубликовать по умолчанию членский инициализатор для структур в 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
Несмотря на то, что по крайней мере невозможно иметь элементный инициализатор по умолчанию, вы можете сделать его быстро, выполнив следующие шаги:
- Сделайте объект временно классом вместо структуры
- Сохранить
- Щелкните правой кнопкой мыши имя класса и выберите refactor → Generate Memberwise Initializer.
- Измените его обратно на структуру
Ответ 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