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

nfg76nw0  于 2022-11-21  发布在  Swift
关注(0)|答案(3)|浏览(216)

我在一个名为“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
我尝试将代码更改为以下内容:
第一次尝试:

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

任何提示都将不胜感激!

j2qf4p5b

j2qf4p5b1#

经验教训:所有公共结构体都需要公共初始化

这并不完全准确。文件上说:

结构类型的默认成员初始值设定项

如果结构的任何存储属性是私有的,则结构类型的默认成员初始值设定项被视为私有。同样,如果结构的任何存储属性是文件私有的,则初始值设定项是文件私有的。否则,初始值设定项具有内部访问级别。
因此内置的成员初始化器只能在包中使用。如果你不提供公共初始化器,你将无法从外部空间创建你的结构体。

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

sg3maiej2#

感谢所有的评论,我终于明白为什么它给我的错误。我的两个尝试应该是好的。
结果发现这个结构并没有引起问题
我让其他结构体使用这个结构体并标记为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
  }
}

我原来的帖子不怎么样,因为我发的代码没有什么问题,但是决定不删除这个帖子,它可能会帮助像我这样的新手未来

**经验教训:**所有公共结构都需要公共init

k5ifujac

k5ifujac3#

当您尝试访问不同框架中的结构时,**
结构中的所有变量都应该是公共的,并且应该在init中设置默认值

**

例如:
公共结构位置点{公共变量位置:NSNumber公共变量颜色:UI颜色

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

相关问题