我在一个名为“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
任何提示将不胜感激!
获得的经验教训:所有公共结构都需要公共init
那不太准确。 documentation说:
如果结构的任何存储属性是私有的,则结构类型的默认成员初始值设定项将被视为私有。同样,如果任何结构的存储属性是文件专用的,则初始化程序是文件专用的。否则,初始化程序具有内部访问级别。
因此,内置的成员初始化程序仅在包中可用。如果您不提供公共初始值设定项,则无法从外层空间创建结构。
感谢所有评论,我终于弄明白为什么它给了我错误。我的两次尝试都应该没问题。
事实证明这个结构不会导致问题
例如,我有其他结构使用此结构并标记为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
当您尝试访问不同框架中的结构时,**
结构中的所有变量都应该是公共的,并且应该在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)}