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)
网友评论