我在一个名为"MyFramework"的框架中有一个 struct

public struct ShipmentPackage:Encodable {
  let package_code:String
  let weight:Float
}

然后当我试图在另一个项目/框架中创建ShipmentPackage时

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

我收到一条错误消息,由于"内部"保护级别,无法访问"ShipmentPackage"初始值设定项

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

第一次try :

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

第二次try :

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

此外,我还try 将包的代码和权重更改为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

任何提示都将不胜感激!

推荐答案

Lesson learned:所有公共 struct 都需要一个公共初始化

这不太准确.documentation个州:

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

如果 struct 的任何存储属性都是私有的,则 struct 类型的默认成员初始值设定项将被视为私有的.同样,如果 struct 的任何存储属性是文件私有的,则初始值设定项是文件私有的.否则,初始值设定项的访问级别为内部.

因此,内置成员初始值设定项仅在包中可用.如果不提供公共初始值设定项,则无法从外层空间创建 struct .

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

Swift相关问答推荐

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

如何在visionOS中定制悬停效果区域

当TextField变为空时,不会触发onChange

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

从 Swift Vapor Server 中调用 ShazamKit

如何在 Combine 合并运算符的输出上使用 eraseToAnyPublisher

SwiftUI 动画的范围

格式化大货币数字

如何使用 ISO 国家代码(2 个字母)查找区域设置标识符

在 Vapor 4 中使用协议的通用流利查询

P384 公钥获取IncorrectParameterSize

我如何从 UIAlertController 导航到新屏幕(swiftUI)

.onTapGesture 不适用于 Stepper,仅适用于其文本

判断 Swift 程序是否正在输出到终端

Swift:连接两个数组而不重复共享后缀/前缀

Alamofire 会自动存储 cookie 吗?

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

如何在 Swift 中判断变量的类型