美文网首页
Swift中的排序和访问控制fileprivate和open关键

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

作者: ziyouzhe4 | 来源:发表于2016-11-23 09:32 被阅读22次

    swift中的访问权限

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

    下面对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)

    相关文章

      网友评论

          本文标题:Swift中的排序和访问控制fileprivate和open关键

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