Публичная структура в среде init недоступна из-за «внутреннего» уровня защиты в компиляторе - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть структура в структуре под названием «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

Любая подсказка будет оценена!

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Спасибо за все комментарии, я наконец понял, почему это дает мне ошибку.Обе мои 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
  }
}

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

Извлеченный урок: все публичные структуры нуждаются в публичной инициализации

0 голосов
/ 25 мая 2019

Когда вы пытаетесь получить доступ к структуре в другой структуре, **

все переменные в структуре должны быть открытыми и иметь значение по умолчанию, установленное в 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 (красный: 255.0 / 255.0, зеленый: 1.0, синий: 205 / 255.0, альфа: 1)}

0 голосов
/ 13 февраля 2019

Извлеченный урок : все публичные структуры нуждаются в публичной инициализации

Это не совсем точно.Документация гласит:

Инициализаторы по умолчанию для каждого элемента для типов структуры

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

Таким образом, встроенный элементный инициализатор доступен только в пакете.Если вы не предоставите публичный инициализатор, вы не сможете создать свою структуру из космоса.

...