Swift中的排序和访问控制fileprivate和open关键字

swift中的访问权限

  • Swift 中的访问控制模型基于模块和源文件这两个概念
    • internal : 在本模块中都可以进行访问
    • fileprivate : 在当前源文件中可以访
    • private : 在当前class中可以访问(extension中也不可以访问)
    • open : 在其他模块中可以访问

下面对swift中fileprivate和open关键字和排序做一下简单地整理

fileprivate

才是真正意义上的私有,为什么这么说呢?以前有个private在一个文件中的其他类是可以访问到的,也就是private是文件内共享,造成了不安全的因素.
在swift 3中,新增加了一个 fileprivate来显式的表明私有,只有在改类内才能访问.

open

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

1.这个元素可以在其他作用域被访问
2.这个元素可以在其他作用域被继承或者override

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

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

这就是 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 { }

现在的访问权限则依次为:open,public,internal,fileprivate,private

排序是日常工作中一定会接触到的,下面说一下swift中的两种排序
经典的冒泡和快速排序.

//用这种方式给array添加一个方法进行排序

extension Array where Element:Comparable{
//冒泡
mutating func bubble() {
    
    for i in 0..

你可能感兴趣的:(Swift中的排序和访问控制fileprivate和open关键字)