将私有子类型设为内部或公共

时间:2018-02-26 16:23:44

标签: swift access-control

有时,当您将类型与协议一致时,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 +属性的类型,它很快就会变得一团糟。

0 个答案:

没有答案