02-Swift4 中 Private 的 使用范围

struct Date {
    private let secondsSinceReferenceDate: Double
}

extension Date: Equatable {
    static func ==(lhs: Date, rhs: Date) -> Bool {
        return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate
    }
}

extension Date: Comparable {
    static func <(lhs: Date, rhs: Date) -> Bool {
        return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate
    }
}

上面的代码在Swift3 中无法运行,因为 会报错:

  • 因 secondsSinceReferenceDate 是 Private 属性,所以不可以在 extension 中访问。
extension Date: Equatable {
    static func ==(lhs: Date, rhs: Date) -> Bool {
        // 1. 在 swift3 不能这么写,因为会得到一个错误
        // error: 'secondsSinceReferenceDate' is inaccessible due to private protaction level
        // 2.1 secondsSinceReferenceDate 是私有保护,所以无法访问
        return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate
    }
}

如果在 swift3中想要 属性在 extension 中被访问到,那属性需要 改成 fileprivate, 但结果就是 在 整个文件中都可以被检索到。

struct Date {
    
    // 2.2 private 是私有声明,所以在 extension 中没有办法获取到 secondsSinceReferenceDate
     // private let secondsSinceReferenceDate: Double
    
    // 2.3 可以使用 Fileprivate 来解决 private 的私有声明
    // 但意味着此定义 在整个文件中都可以被检索到,这样不好。范围太广了
     fileprivate let secondsSinceReferenceDate: Double
}

在 Swift 4 中,从新扩展了 私有定义(Private)的范围,覆盖同一源文件中特定类型的所有扩展的声明,这与使用扩展来组件的代码的概念更加吻合;
所以以后再同一文件中,可以不使用 fileprivate 使用 private

SE-0169: Improve Interaction Between Private Declarations and Extensions

你可能感兴趣的:(02-Swift4 中 Private 的 使用范围)