由于编译器中的“内部”保护级别,框架init中的公共结构是不可访问的

问题描述 投票:0回答:2

我在一个名为“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

任何提示将不胜感激!

swift access-control swift-custom-framework
2个回答
5
投票

获得的经验教训:所有公共结构都需要公共init

那不太准确。 documentation说:

Default Memberwise Initializers for Structure Types

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

因此,内置的成员初始化程序仅在包中可用。如果您不提供公共初始值设定项,则无法从外层空间创建结构。


0
投票

感谢所有评论,我终于弄明白为什么它给了我错误。我的两次尝试都应该没问题。

事实证明这个结构不会导致问题

例如,我有其他结构使用此结构并标记为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


0
投票

当您尝试访问不同框架中的结构时,**

结构中的所有变量都应该是公共的,并且应该在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)
    }
}

您也可以根据调用struct的方式编写init,如下所示。

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

© www.soinside.com 2019 - 2024. All rights reserved.