Swift語(yǔ)言中的一些訪問(wèn)控制設(shè)置詳解
限制訪問(wèn)代碼塊,模塊和抽象通過(guò)訪問(wèn)控制來(lái)完成。類(lèi),結(jié)構(gòu)和枚舉可以根據(jù)自己的屬性,方法,初始化函數(shù)和下標(biāo)來(lái)通過(guò)訪問(wèn)控制機(jī)制進(jìn)行訪問(wèn)。常量,變量和函數(shù)的協(xié)議限制,并允許通過(guò)訪問(wèn)控制來(lái)訪問(wèn)全局和局部變量。應(yīng)用于屬性,類(lèi)型及函數(shù)的訪問(wèn)控制可以被稱(chēng)為“實(shí)體”。
訪問(wèn)控制模型是基于模塊和源文件的。
模塊定義為代碼分配一個(gè)單獨(dú)的單元,并且可以使用import 關(guān)鍵字導(dǎo)入。源文件被定義為一個(gè)單一的源代碼文件,模塊可訪問(wèn)多種類(lèi)型和函數(shù)。
三種不同的訪問(wèn)級(jí)別是由 Swift 語(yǔ)言提供。它們分別是 Public, Internal 和 Private 訪問(wèn)。

語(yǔ)法
public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}
對(duì)于函數(shù)類(lèi)型的訪問(wèn)控制
某些函數(shù)可能有參數(shù)在函數(shù)聲明中但沒(méi)有任何返回值。下面的程序聲明 a 和 b 作為參數(shù)傳遞給sum()函數(shù)。內(nèi)部函數(shù)本身為參數(shù)a和b的值是通過(guò)調(diào)用所述通過(guò)調(diào)用函數(shù) sum(),其值被打印從而不用返回值。為了使函數(shù)的返回類(lèi)型為私有,聲明函數(shù)使用 private 修飾整體訪問(wèn)級(jí)別。
private func sum(a: Int, b: Int) {
let a = a + b
let b = a - b
println(a, b)
}
sum(20, 10)
sum(40,10)
sum(24,6)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
(30, 20) (50, 40) (30, 24)
對(duì)于枚舉類(lèi)型的訪問(wèn)控制
public enum Student{
case Name(String)
case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
println("Student name is: \(studName).")
case .Mark(let Mark1, let Mark2, let Mark3):
println("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
default:
println("Nothing")
}
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
Student Marks are: 98,97,95
枚舉在Swift語(yǔ)言中將自動(dòng)接收枚舉個(gè)體并都具有相同的訪問(wèn)級(jí)別。例如,考慮訪問(wèn)固定于三個(gè)科目枚舉名稱(chēng),學(xué)生的名字和標(biāo)記被聲明為 student 而存在于枚舉類(lèi)中的成員都屬于字符串?dāng)?shù)據(jù)類(lèi)型名稱(chēng),標(biāo)記表示為 mark1, mark2 和 mark3 數(shù)據(jù)類(lèi)型為整數(shù)。要訪問(wèn)無(wú)論是學(xué)生名稱(chēng)或標(biāo)記分?jǐn)?shù)。 現(xiàn)在,如果被執(zhí)行 Switch case 塊將打印學(xué)生姓名,否則它將打印由學(xué)生固定的標(biāo)記。如果這兩個(gè)條件都失敗默認(rèn)塊將被執(zhí)行。
子類(lèi)訪問(wèn)控制
Swift 允許用戶子類(lèi),可以在當(dāng)前訪問(wèn)上下文存取的任何類(lèi)。子類(lèi)不能比其超類(lèi)有更高的訪問(wèn)級(jí)別。 用戶限制一個(gè)公共子類(lèi)寫(xiě)入一個(gè)內(nèi)部超類(lèi)。
public class cricket {
private func print() {
println("Welcome to Swift Super Class")
}
}
internal class tennis: cricket {
override internal func print() {
println("Welcome to Swift Sub Class")
}
}
let cricinstance = cricket()
cricinstance.print()
let tennisinstance = tennis()
tennisinstance.print()
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
Welcome to Swift Super Class Welcome to Swift Sub Class
常量,變量,屬性和下標(biāo)訪問(wèn)控制
Swift 常量,變量或?qū)傩圆荒鼙欢x比其類(lèi)型更公開(kāi)。這是無(wú)效一個(gè) public 屬性與 private 類(lèi)型的寫(xiě)法。同樣,下標(biāo)不能超過(guò)其索引或返回類(lèi)型更公開(kāi)。
當(dāng)一個(gè)常量,變量,屬性或下標(biāo)使用了一個(gè)私有類(lèi)型,則常量,變量,屬性或下標(biāo),也必須標(biāo)記為私有:
getter和setter常量,變量,屬性和標(biāo)自動(dòng)接收它們屬于相同的訪問(wèn)級(jí)別的常量,變量,屬性或下標(biāo)。
class Samplepgm {
private var counter: Int = 0{
willSet(newTotal){
println("Total Counter is: \(newTotal)")
}
didSet{
if counter > oldValue {
println("Newly Added Counter \(counter - oldValue)")
}
}
}
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
訪問(wèn)控制的初始化和默認(rèn)初始化器
自定義初始化函數(shù)可分配的接入級(jí)別小于或等于它們初始化的類(lèi)型。一個(gè)必需的初始化必須具有相同的訪問(wèn)級(jí)別,因?yàn)樗鼈兒皖?lèi)相同。一個(gè)初始化的參數(shù)的類(lèi)型不能比初始化自己的訪問(wèn)級(jí)別更私密(更高)。
聲明每個(gè)和初始化每個(gè)子類(lèi), “required” 關(guān)鍵字需要在init()函數(shù)之前定義。
class classA {
required init() {
var a = 10
println(a)
}
}
class classB: classA {
required init() {
var b = 30
println(b)
}
}
let res = classA()
let print = classB()
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
10 30 10
默認(rèn)初始化具有相同的訪問(wèn)級(jí)別,因?yàn)樗跏蓟?,除非該?lèi)型被定義為公共類(lèi)型。 當(dāng)默認(rèn)初始化定義為公共它被認(rèn)為是內(nèi)部的。當(dāng)用戶需要一個(gè)公共類(lèi)型在另一個(gè)模塊中的一個(gè)無(wú)參數(shù)初始化進(jìn)行初始化,明確提供一個(gè)公共的無(wú)參數(shù)初始化作為類(lèi)型定義的一部分。
對(duì)于協(xié)議的訪問(wèn)控制
當(dāng)我們定義一個(gè)新的協(xié)議,從現(xiàn)有的協(xié)議繼承的功能,既有聲明相同的訪問(wèn)級(jí)別以相互繼承屬性。Swift 訪問(wèn)控制允許用戶定義 “public” 協(xié)議,它繼承自 “internal” 的協(xié)議。
public protocol tcpprotocol {
init(no1: Int)
}
public class mainClass {
var no1: Int // local storage
init(no1: Int) {
self.no1 = no1 // initialization
}
}
class subClass: mainClass, tcpprotocol {
var no2: Int
init(no1: Int, no2 : Int) {
self.no2 = no2
super.init(no1:no1)
}
// Requires only one parameter for convenient method
required override convenience init(no1: Int) {
self.init(no1:no1, no2:0)
}
}
let res = mainClass(no1: 20)
let print = subClass(no1: 30, no2: 50)
println("res is: \(res.no1)")
println("res is: \(print.no1)")
println("res is: \(print.no2)")
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
res is: 20 res is: 30 res is: 50
擴(kuò)展訪問(wèn)控制
當(dāng)用戶使用擴(kuò)展來(lái)添加協(xié)議的一致性,Swift 不允許用戶為擴(kuò)展提供一個(gè)明確的訪問(wèn)級(jí)別修飾符。對(duì)于在每個(gè)協(xié)議的擴(kuò)展,要求實(shí)現(xiàn)的默認(rèn)訪問(wèn)級(jí)別設(shè)置自己的協(xié)議訪問(wèn)級(jí)別。
對(duì)于泛型訪問(wèn)控制
泛型允許用戶指定最小訪問(wèn)級(jí)別來(lái)訪問(wèn)類(lèi)型約束其類(lèi)型參數(shù)。
public struct TOS<T> {
var items = [T]()
private mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push("Swift")
println(tos.items)
tos.push("Generics")
println(tos.items)
tos.push("Type Parameters")
println(tos.items)
tos.push("Naming Type Parameters")
println(tos.items)
let deletetos = tos.pop()
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
[Swift] [Swift, Generics] [Swift, Generics, Type Parameters] [Swift, Generics, Type Parameters, Naming Type Parameters]
對(duì)于類(lèi)型別名訪問(wèn)控制
用戶可以定義類(lèi)型別名對(duì)待不同的訪問(wèn)控制類(lèi)型。 相同的訪問(wèn)級(jí)別或不同的訪問(wèn)級(jí)別可以由用戶定義。當(dāng)類(lèi)型別名為 “private” 及其相關(guān)成員可以聲明為 “private,內(nèi)部 public 類(lèi)型 ”。當(dāng)類(lèi)型別名是公共成員不能是別名為 “internal” 或 “private” 的名稱(chēng)
定義任何類(lèi)型別名被視為用于不同類(lèi)型的訪問(wèn)控制的目的。一個(gè)類(lèi)型別名可以具有小于或等于它的一個(gè)訪問(wèn)級(jí)別別名的類(lèi)型的訪問(wèn)級(jí)別。例如,private類(lèi)型別名可以別名為 private, internal, 或 public,而 public 類(lèi)型別名不能別名為 internal 或 private 類(lèi)型。
public protocol Container {
typealias ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct Stack<T>: Container {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, anotherContainer: C2) -> Bool {
// check that both containers contain the same number of items
if someContainer.count != anotherContainer.count {
return false
}
// check each pair of items to see if they are equivalent
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// all items match, so return true
return true
}
var tos = Stack<String>()
tos.push("Swift")
println(tos.items)
tos.push("Generics")
println(tos.items)
tos.push("Where Clause")
println(tos.items)
var eos = ["Swift", "Generics", "Where Clause"]
println(eos)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果
[Swift] [Swift, Generics] [Swift, Generics, Where Clause] [Swift, Generics, Where Clause]
相關(guān)文章
LeetCode?題解?Swift?有效的完全平方數(shù)
這篇文章主要為大家介紹了LeetCode?題解?Swift?有效的完全平方數(shù)方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Swift的74個(gè)常用內(nèi)置函數(shù)介紹
這篇文章主要介紹了Swift的74個(gè)常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫(kù)函數(shù),內(nèi)置函數(shù)是指無(wú)需引入任何模塊即可以直接使用的函數(shù),需要的朋友可以參考下2015-01-01
Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解
這篇文章主要介紹了Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能
這篇文章主要給大家介紹了關(guān)于Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來(lái)一起看看吧2018-05-05
Swift中優(yōu)雅處理閉包導(dǎo)致的循環(huán)引用詳解
這篇文章主要給大家介紹了關(guān)于Swift中優(yōu)雅的處理閉包導(dǎo)致的循環(huán)引用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Swift3遷移至Swift4可能遇到的問(wèn)題小結(jié)
每當(dāng)看到新的編程語(yǔ)言我總是會(huì)有相當(dāng)大的興趣,所以下面這篇文章主要給大家介紹了關(guān)于Swift3遷移至Swift4可能遇到的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
Swift HTTP加載請(qǐng)求Loading Requests教程
這篇文章主要為大家介紹了Swift HTTP加載請(qǐng)求Loading Requests教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
mac git xcrun error active developer path 錯(cuò)誤
本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時(shí),出現(xiàn)了錯(cuò)誤(mac git xcrun error active developer path)的解決辦法,希望對(duì)大家有所幫助2014-09-09

