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

2016-11-23  本文已影响22人  ziyouzhe4

swift中的访问权限

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

fileprivate

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

open

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

1.这个元素可以在其他作用域被访问
2.这个元素可以在其他作用域被继承或者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 { }

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

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

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

extension Array where Element:Comparable{
//冒泡
mutating func bubble() {
    
    for i in 0..<self.count-1{
        
        for j in (i+1...self.count-1).reversed(){
            
            if self[j] < self[j-1]{
                swap(i: j, j: j-1)
            }
        }
    }
}

// 交换位置方法
fileprivate mutating func swap(i:Int,j:Int){
    
    let temp = self[i]
    self[i] = self[j]
    self[j] = temp
}

调用只要:  

    var arr = [2,4,6,11,1,9]
    arr.bubble()
    print(arr)
上一篇下一篇

猜你喜欢

热点阅读