主要介紹swift中的訪問控制權(quán)限關(guān)鍵字
private
1糊啡、private
:訪問級別僅在當(dāng)前定義的作用域內(nèi)有效
(單例中使用過)
//8-1切诀、private:訪問級別`僅在當(dāng)前定義的作用域內(nèi)有效
class CJLTeacher{
static let shareInstance = CJLTeacher()
private init(){}
}
var t = CJLTeacher.shareInstance
filePrivate
filePrivate
:訪問限制僅限制在當(dāng)前定義的源文件中
<!--1件缸、在access.swift文件中定義CJLPartTimeTeacher-->
fileprivate class CJLPartTimeTeacher: CJLTeacher{
var partTime: Double?
init(_ partTime: Double) {
super.init()
self.partTime = partTime
}
}
<!--2、在main.swift中無法訪問CJLPartTimeTeacher-->
在access.swift文件中定義一個CJLPartTimeTeacher
全局變量茧痕,系統(tǒng)報錯句葵,其主要原因是 pt 默認(rèn)的權(quán)限是 Internal的,而CJLPartTimeTeacher
的訪問權(quán)限是fileprivate
的廊遍,pt的權(quán)限大于CJLPartTimeTeacher
嬉愧,系統(tǒng)不允許這樣,所以提示錯誤
- 需要使用
private / fileprivate
修飾pt
private let pt = CJLPartTimeTeacher(10.0)
//或者
fileprivate let pt = CJLPartTimeTeacher(10.0)
如果是直接定義在方法中的喉前,可以不用訪問權(quán)限修飾符
func test(){
let pt = CJLPartTimeTeacher(10.0)
}
Internal
Internal
:默認(rèn)訪問級別没酣,允許定義模塊中的任意源文件訪問王财,但不能被該模塊之外的任何源文件訪問(例如 import Foundation,其中Foundation就是一個模塊)
<!--1裕便、main.swift-->
import Foundation
class CJLTeacher{
init(){}
}
let t = CJLTeacher()
<!--2绒净、custom-->
import AppKit
//訪問main.swift中t,報錯:Expressions are not allowed at the top level
print(t)
報錯的主要原因是
t
在main.swift
文件中的默認(rèn)權(quán)限是Internal
偿衰,只能在同一個模塊內(nèi)使用挂疆,其屬于Foundation
模塊,而custom.swift
文件中不能調(diào)用t下翎,是因為其屬于AppKit
模塊缤言,與Foundation
并不是同一個模塊,所以不能訪問
public
public
:開放式訪問视事,使我們能夠在其定義模塊的任何源文件中使用代碼胆萧,并且可以從另一個源文件訪問源文件。但是只能在定義的模塊中繼承和子類重寫
open
open
:最不受限制的訪問級別俐东,可以在任意地方跌穗、任意模塊間被繼承、定義虏辫、重寫
public與open的區(qū)別:
public不可繼承
open可繼承
總結(jié):
沒有寫訪問控制權(quán)限關(guān)鍵字時蚌吸,
默認(rèn)
的訪問權(quán)限是internal
-
訪問控制權(quán)限
從高到低
的順序:open > public > internal > filePrivate > private
1、
private
:訪問級別僅在當(dāng)前定義的作用域內(nèi)有效
2砌庄、
filePrivate
:訪問限制僅限制在當(dāng)前定義的源文件中
3套利、
Internal
:默認(rèn)訪問級別,允許定義模塊中的任意源文件訪問鹤耍,但不能被該模塊之外的任何源文件訪問4肉迫、
public
:開放式訪問,使我們能夠在其定義模塊的任何源文件中使用代碼稿黄,并且可以從另一個源文件訪問源文件喊衫。但是只能在定義的模塊中繼承和子類重寫
5、
open
:最不受限制的訪問級別杆怕,可以在任意地方族购、任意模塊間被繼承、定義陵珍、重寫