有时,当您将类型与协议一致时,Swift编译器将为您合成子类型。根据我的经验,这些类型的访问级别为private
。这通常很好,但我遇到过一个案例,我希望能够访问另一个文件中的私有子类型(同一模块,如果你想知道),你apparently can't do。
是否可以为该类型提供更高的访问级别,而无需手动编写并利用合成代码?
发生这种情况的一个例子是Codable
的一致性。 CodableKeys
子类型在合成时声明为private
,但您可以在手动编写时将其设置为所需的任何访问级别。
以下是引发此错误的代码示例。
Company.swift
:
class Company: Codable {
let name: String
let founded: Date
init(name: String, founded: Date) {
self.name = name
self.founded = founded
}
}
Company+JSON.swift
:
extension Company {
func json() -> JSON {
let data: [String: JSON] = [
CodingKeys.name: self.name
]
return JSON.object(data)
}
}
我明白了:
'CodingKeys' is inaccessible due to 'private' protection level
为这种类型的类型编写类型并不困难,但如果您有多个具有9,10,11 +属性的类型,它很快就会变得一团糟。