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
网友评论