Публичная структура в среде init недоступна из-за "внутреннего" уровня защиты в компиляторе
У меня есть структура в рамках под названием "MyFramework"
public struct ShipmentPackage:Encodable {
let package_code:String
let weight:Float
}
Затем, когда я пытаюсь создать ShipmentPackage в другом проекте / фреймворке
import MyFramework
let onePackage = ShipmentPackage(package_code:"BX",weight:100)
Я получил сообщение об ошибке: инициализатор "ShipmentPackage" недоступен из-за "внутреннего" уровня защиты. Я захожу по этой ссылке https://forums.swift.org/t/public-struct-init-is-unexpectedly-internal/5028
Я попытался изменить свой код следующим образом:
1-я попытка:
public struct ShipmentPackage:Encodable {
let package_code:String
let weight:Float
public init(package_code:String,weight:Float){
self.package_code = package_code
self.weight = weight
}
}
2-я попытка:
public struct ShipmentPackage:Encodable {
public let package_code:String
public let weight:Float
public init(package_code:String,weight:Float){
self.package_code = package_code
self.weight = weight
}
}
Также я попытался изменить пакетный код и общий вес на public, но ничего из вышеперечисленного не работает, я получаю сообщения об ошибках при компиляции
<unknown>:0: error: 'init' is inaccessible due to 'internal' protection level
<unknown>:0: note: 'init' declared here
<unknown>:0: error: 'init' is inaccessible due to 'internal' protection level
Любая подсказка будет оценена!
4 ответа
Извлеченный урок: все публичные структуры нуждаются в публичной инициализации
Это не совсем точно. В документации говорится:
Поэлементные инициализаторы по умолчанию для типов структуры
Поэлементный инициализатор по умолчанию для типа структуры считается закрытым, если любое из сохраненных свойств структуры является закрытым. Аналогично, если какое-либо из сохраненных свойств структуры является закрытым файлом, инициализатор является закрытым файлом. В противном случае инициализатор имеет внутренний уровень доступа.
Таким образом, встроенный элементный инициализатор доступен только внутри пакета. Если вы не предоставите публичный инициализатор, вы не сможете создать свою структуру из космоса.
Спасибо за все комментарии, я наконец понял, почему это дает мне ошибку. Обе мои 2 попытки должны быть в порядке.
И оказалось, что эта структура не вызывает проблем
У меня есть другая структура, использующая эту структуру и помеченная как public, например
public struct Shipment:Encodable {
let carrier_code:String
let packages:[ShipmentPackage]
}
отсутствовал инициализатор, но по какой-то причине XCode не будет указывать на ошибку для моей рабочей области, но выдаст ошибку во время компиляции.
после инициализации всех открытых структур приложение передает компилятор.
public struct Shipment:Encodable {
let carrier_code:String
let packages:[ShipmentPackage]
public init(carrier_code:String,packages:[ShipmentPackage]){
self.carrier_code = carrier_code
self.packages = packages
}
}
Мой оригинальный пост был не очень хорош, так как в коде, который я разместил, не было ничего плохого, но решите не удалять этот пост, он может помочь таким новичкам, как я, в будущем
Извлеченный урок: всем публичным структурам нужен публичный иници
Отметьте свою структуру и ее свойства как общедоступные
Похоже на добавление
public init
методы со всеми их параметрами и назначениями свойств больше не требуются. Вот что у меня работает в Xcode 13 beta 5 :
public struct ShipmentPackage: Encodable {
public let package_code: String
public let weight: Float
}
Обратите внимание на
public
ключевое слово перед свойствами и без явного
init
метод внутри структуры.
Когда вы пытаетесь получить доступ к структуре в другой структуре, **
все переменные в структуре должны быть общедоступными и иметь значение по умолчанию, установленное в init
**
например:
public struct LocationPoint {public var location: NSNumber public var color: UIColor
public init(location: NSNumber? = 0, color: UIColor? = nil ) {
self.location = location ?? 0
self.color = color ?? UIColor.init(red: 255.0/255.0, green: 1.0, blue: 205/255.0, alpha: 1)
}
}
Вы также можете написать init, как показано ниже, в зависимости от того, как вы вызываете структуру.
public init() {
self.location = 0
self.color = UIColor.init(red: 255.0/255.0, green: 1.0, blue: 205/255.0, alpha: 1)
}