专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

Swift 3必看:新的访问控制fileprivate和open

Cocoa开发者社区  · 公众号  · ios  · 2016-09-10 08:59

正文

请到「今天看啥」查看全文



由此,在swift 3中,新增加了一个 fileprivate来显式的表明,这个元素的访问权限为文件内私有。过去的private对应现在的fileprivate。现在的private则是真正的私有,离开了这个类或者结构体的作用域外面就无法访问。


open


open则是弥补public语义上的不足。 现在的pubic有两层含义:


  • 这个元素可以在其他作用域被访问

  • 这个元素可以在其他作用域被继承或者override


继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是 final。


final的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。


这就是 open产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。


下面是例子:


/// ModuleA:

// 这个类在ModuleA的范围外是不能被继承的,只能被访问

public class NonSubclassableParentClass {

public func foo() {}

// 这是错误的写法,因为class已经不能被继承,

// 所以他的方法的访问权限不能大于类的访问权限

open func bar() {}

// final的含义保持不变

public final func baz() {}

}

// 在ModuleA的范围外可以被继承

open class SubclassableParentClass {

// 这个属性在ModuleA的范围外不能被override

public var size : Int

// 这个方法在ModuleA的范围外不能被override

public func foo() {}

// 这个方法在任何地方都可以被override

open func bar() {}

///final的含义保持不变

public final func baz() {}

}

/// final的含义保持不变

public final class FinalClass { }







请到「今天看啥」查看全文


推荐文章
笑的合不拢嘴  ·  夫妻视频,真人真事!
8 年前
南沙365  ·  南沙网招聘版4月27日招聘信息
8 年前
玩转手机摄影  ·  创意毕业照,花样108式!
8 年前