由于编译器中的保护级别'internal'框架 init 中的公共结构无法访问



我在一个名为" myframework"

的框架中有一个结构
public struct ShipmentPackage:Encodable {
  let package_code:String
  let weight:Float
}

然后,当我尝试在另一个项目/框架中创建一个装运袋

import MyFramework
let onePackage = ShipmentPackage(package_code:"BX",weight:100)

我收到了一个错误消息" shipmentpackage'初始化器,由于"内部"保护级别无法访问我来到此链接https://forums.swift.org/t/public-sonstruct-init-is-is-uncretedly-internal/5028

我试图将代码更改为以下:

第一次尝试:

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
  }
}

第二次尝试:

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
  }
}

我也尝试将package_code和重量转换为公开,但是上述工作都没有,当编译时我收到错误消息

<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

任何提示都将不胜感激!

课程学习:所有公共结构都需要一个公共init

这不是很精确。文档指出:

默认的结构类型的成员初始化

如果结构的存储属性是私有的,则将结构类型的默认成员初始化器视为私有。同样,如果任何结构的存储属性是私有文件,则初始化器是私有的。否则,初始化器具有内部访问级别。

因此,Build-In-In-In-In-Wise初始化器仅在软件包中可用。如果您不提供公共初始化器,则将无法从外太空创建结构。

public struct YourFrameworkStruct {
    let frameworkStructProperty: String!
    /// Your public structs in your framework need a public init.
    /// 
    /// Don't forget to add your let properties initial values too.
    public init(frameworkStructProperty: String) {
        self.frameworkStructProperty = frameworkStructProperty
    }
}

感谢所有评论,我终于弄清楚了为什么会给我错误。我的两次尝试都可以。

事实证明,这个结构并没有引起问题

我有其他结构使用此结构,并标记为公众,例如

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
  }
}

我的原始帖子并不是很好,因为我发布的代码没有错,但决定不删除这篇文章,它可能会在将来有助于像我这样的新手

学习的课程:所有公共结构都需要一个公共init

尝试在其他框架中访问结构时**

结构内的所有变量都应公开,应该有一个 在init

中设置默认值

**

eg:

公共结构位置{ 公共VAR位置:nsnumber 公共var颜色: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)
    }
}

您也可以根据您调用struct的方式写下初始化。

 public init() {
     self.location = 0
     self.color = UIColor.init(red: 255.0/255.0, green: 1.0, blue: 205/255.0, alpha: 1)
 }

最新更新