/*
1.訪問控制
在訪問許可權控制這一塊,swift提供了5個不同的訪問級別,以下是從高到低排列,實體指被訪問級別修飾的內容
open:允許在定義實體的模組、其他模組中訪問,允許其他模組進行繼承、重寫(open只能用在類、類成員上)
public:允許在定義實體的模組、其他模組中訪問,不允許其他模組進行繼承、重寫
internal:只允許在定義實體的模組中訪問,不允許在其他模組中訪問
fileprivate:只允許在定義實體的原始檔中訪問
private:只允許在定義實體的封閉宣告中訪問
絕大多數實體預設都是internal級別
2.訪問級別的使用準則
乙個實體不可以被更低訪問級別的實體定義,核心準則,比如
常量\常量型別》=變數\常量
引數型別、返回值型別》=函式
父類》=子類
父協議》=子協議
原型別》=typealias
原始值型別、關聯值型別》=列舉型別
定義型別a時用到的其他型別》=型別a
也就是左邊去定義右邊,左邊型別》=右邊
*///變數型別的訪問級別public >= 變數的訪問級別internal
public class pp {}
internal var pp: pp
fileprivate typealias myint = int
fileprivate typealias mystring = string
fileprivate enum score
//3.元組型別
//元組型別的訪問級別是所有成員型別最低的那個
internal struct dog {}
fileprivate class person {}
//(dog, person)的訪問級別是fileprivate
fileprivate var data1: (dog, person)
private var data2: (dog, person)
//4.泛型型別
//泛型型別的訪問級別是型別的訪問級別以及所有泛型型別引數的訪問級別中最低的那個
internal class car {}
fileprivate class bus {}
public class son{}
//person的訪問級別是fileprivate
fileprivate var p = son()
//5.成員、巢狀型別
//型別的訪問級別會影響成員(屬性、方法、初始化器、下標)、巢狀型別的預設訪問級別
//一般情況下,型別為private或fileprivate,那麼成員、巢狀型別預設也是private、fileprivate
fileprivate class lion //fileprivate
enum season //fileprivate
}//一般情況下,型別為internal或public,那麼成員、巢狀型別預設是internal
public class mouse //internal
enum season //internal
}//成員的重寫
//子類重寫的成員的訪問級別必須》=子類分訪問級別,或者》=父類被重寫成員的訪問級別
//下邊的協議也一樣
class big
}fileprivate class small : big //fileprivate >= internal、fileprivate中的最小乙個
}//父類的成員不能被成員作用域外定義的子類重寫
class aa
//下邊**寫到這裡可編譯通過,寫在aa大括號外編譯不通過
class aa : aa
get
}override func run() {}}}
//6.下面**能都編譯通過?分情況
class test
// fileprivate class moon : sun {} //編譯不通過
}private class sun {}
fileprivate class moon : sun {} //可以編譯通過,在全域性作用域下定義的private等價於fileprivate
class test1 //沒寫 private 就跟dog一樣可以在test1大括號內訪問
}private struct person }}
//getter、setter預設自動接收它們所屬環境的訪問級別
//可以給setter單獨設定乙個比getter更低的訪問級別,用以限制寫的許可權
fileprivate(set) public var num = 10
class stone
get
}internal(set) public subscript(index: int) -> int
get }}
//8.初始化器
//如果乙個public類想再另乙個模組呼叫編譯生成的預設無參初始化器,必須顯示提供public的無參初始化器,因為public類的預設初始化器是internal級別
public class a //刪掉public 無法訪問a()
}//testswift
var a = a()
//required初始化器》=它的預設訪問級別
public class bb //internal >= internal
}//如果結構體有private、fileprivate的儲存例項屬性,那麼它的成員初始化器也是private、fileprivate,否則預設就是internal
struct point
//var p = point(x: 10, y: 10) //報錯
//9.列舉型別的case:列舉是啥case就是啥
//不能給enum的每個case單獨設定訪問級別,每個case自動接收enum的訪問級別,public enum定義的case也是public
public enum season
//10.協議
//協議中定義的要求自動接收協議的訪問級別,不能單獨設定訪問級別,public定義的要求也是public
internal protocol runn
//協議實現的訪問級別必須》=型別的訪問級別,或者》=協議的訪問級別
fileprivate protocol walkable
public class duck : walkable //fileprivate >= public、fileprivate中的最小乙個
}//下面**編譯通過麼?不通過
public protocol jumpabble
//public class frog : jumpabble //因為預設是internal 加上public就不報錯
//}//11.拓展
class person1 {}
fileprivate extension person1 //如果有顯示設定拓展的訪問級別,拓展新增的成員自動接收拓展的訪問級別即這裡是fileprivate
}class person2 }
extension person2 //如果沒有顯示設定拓展的訪問級別,拓展新增的成員的預設訪問級別跟直接在型別中定義的成員一樣
}class person3
extension person3 //可以單獨給拓展新增的成員設定訪問級別
}class person4 {}
extension person4 : runn }/*
在同一檔案中的拓展,可以寫成類似多個部分的型別宣告,在原本的宣告中宣告乙個私有成員,可以再同一檔案的拓展中訪問它,在拓展中國宣告的乙個私有成員,可以在同一檔案的其他拓展中、原本宣告中訪問它。總之可以理解為他們是在同乙個類檔案下的不同部分所以可以不收private限制訪問。
*/public class cup
private func eat0()
}extension cup
private func eat1()
}extension cup
}//12.將方法賦值給var/let
struct rabbit
static func run(_ v: int)
}let fn1 = rabbit.run
fn1(10) //static func run 10
let fn2: (int) -> () = rabbit.run
fn2(20) //static func run 10
let fn3: (rabbit) -> ((int) -> ()) = rabbit.run
fn3(rabbit(age: 18))(30) //func run 18 30
訪問控制模型 強制訪問控制
強制安全訪問控制基於安全標籤的讀寫策略使資料庫管理系統能夠跟蹤資料的流動,可以避免和防止大多數對資料庫有意或無意的侵害,因而,可以為木馬程式問題提供一定程度的保護,在資料庫管理系統中有很大的應用價值。其典型代表是bell la padula模型 簡稱 blp模型 和 biba 模型,也是目前應用最為...
關於linux訪問控制(ACL訪問控制)
由於linux系統的基本許可權控制是針對文件所有者或其他賬戶來進行控制的,無法對單獨賬戶控制,這是acl訪問控制許可權,使用acl我們可以針對單一賬戶設定文件的訪問許可權 描述 檢視文件的acl全新啊 用法 通過getfacl對檔案或目錄進行acl許可權檢視 用來對檔案進行訪問控制 用法 setfa...
OPENLDAP 訪問控制
1 語法 access to by 其中,access to指示啟用訪問控制,上句大致可以理解為 access to 對什麼目標進行控制 by 作用於哪些訪問者 授予什麼樣的訪問許可權 採取什麼樣的匹配控制動作 2 剖析 2.1 控制目標這一域主要是實現對acl應用物件的指定,物件可以是記錄和屬性。...