美文网首页WWDC2017
02-Swift4 中 Private 的 使用范围

02-Swift4 中 Private 的 使用范围

作者: 文瑶906 | 来源:发表于2018-05-03 15:05 被阅读0次
    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 的 使用范围

        本文链接:https://www.haomeiwen.com/subject/vxakrftx.html