網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
訪問控制(Access Control)
1、在訪問權(quán)限控制這塊,Swift提供了5個(gè)不同的訪問級(jí)別(以下是從高到低排序,實(shí)體指被訪問級(jí)別修飾的內(nèi)容)
- open:允許在定義實(shí)體的模塊、其他模塊中訪問,允許其他莫模塊進(jìn)行繼承、重寫(open只能用在類、類成員上)
- public:允許在定義實(shí)體的模塊、其他模塊中訪問,不允許其他模塊進(jìn)行繼承、重寫
- internal:只允許在定義實(shí)體的模塊中訪問,不允許在其他模塊中訪問
- fileprivate:只允許在定義實(shí)體的源文件中訪問
- private:只允許在定義實(shí)體的封閉聲明中訪問
2、絕大部分實(shí)體默認(rèn)都是internal級(jí)別
訪問級(jí)別的使用準(zhǔn)則
1、一個(gè)實(shí)體不可以被更低訪問級(jí)別的實(shí)體定義,比如
- 變量\常量類型 >= 變量\常量
- 參數(shù)類型、返回值類型 >= 函數(shù)
- 父類 >= 子類
- ……
元組類型
1、元組類型的訪問界別是所有成員類型最低的那個(gè)
internal struct Dog {}
fileprivate class Person {}
//(Dog, Person)的訪問級(jí)別是fileprivate
fileprivate var data1: (Dog, Person)
private var data2: (Dog, Person)
泛型類型
1、泛型類型的訪問級(jí)別是 類型的訪問級(jí)別 以及 所有泛型類型參數(shù)的訪問級(jí)別 中最低的那個(gè)
成員、嵌套類型
1、類型的訪問級(jí)別會(huì)影響成員(屬性、方法、初始化器、下標(biāo))嵌套類型的默認(rèn)訪問級(jí)別
- 一般情況下,類型為private或fileprivate,那么成員\嵌套類型默認(rèn)也是private或fileprivate
- 一般情況下,類型為internal或public,那么成員\嵌套類型默認(rèn)是internal
2、直接在全局作用域下定義的private等價(jià)于fileprivate
private struct Dog {
var age: Int = 0
func run() {}
}
fileprivate struct Person {
var dog: Dog = Dog()
mutating func walk() {
dog.run()
dog.age = 1
}
}
3、子類重寫的成員訪問級(jí)別必須 >= 父類的成員訪問級(jí)別
getter與setter
1、getter、setter默認(rèn)自動(dòng)接收他們所屬環(huán)境的訪問級(jí)別
2、可以給setter單獨(dú)設(shè)置一個(gè)比getter更低的訪問級(jí)別,用以限制寫的權(quán)限
fileprivate(set) public var num = 10
class Person {
private(set) var age = 0
fileprivate(set) public var weight: Int {
set {}
get { 10 }
}
internal(set) public subscript(index: Int) -> Int {
set {}
get { index }
}
}
初始化器
1、如果一個(gè)public類想在另一個(gè)模塊調(diào)用編譯生成的默認(rèn)無(wú)參初始化器,必須顯式提供public的無(wú)參初始化器
因?yàn)閜ublic類的默認(rèn)初始化器時(shí)internal級(jí)別的
2、required初始化器必須跟他所屬類擁有相同的訪問級(jí)別
3、如果結(jié)構(gòu)體有private\fileprivate的存儲(chǔ)實(shí)例屬性,那么它的成員初始化器也是private\fileprivate
否則默認(rèn)就是internal
枚舉類型的case
1、不能給enum的每個(gè)case單獨(dú)設(shè)置訪問級(jí)別
2、每個(gè)case自動(dòng)接收enum的訪問級(jí)別
public enum定義的case也是public
協(xié)議
1、協(xié)議中定義的要求(方法)自動(dòng)接收協(xié)議的訪問級(jí)別,不能單獨(dú)設(shè)置訪問級(jí)別
public協(xié)議定義的要求(方法)也是public
2、協(xié)議實(shí)現(xiàn)的訪問級(jí)別必須 >= 類型的訪問級(jí)別,或者 >= 協(xié)議的訪問級(jí)別
擴(kuò)展
1、如果有顯式設(shè)置擴(kuò)展的訪問級(jí)別,擴(kuò)展添加的成員自動(dòng)接收擴(kuò)展的訪問級(jí)別
2、如果沒有顯式設(shè)置擴(kuò)展的訪問級(jí)別,擴(kuò)展添加的成員的默認(rèn)訪問級(jí)別,跟直接在類型中定義的成員一樣
3、可以單獨(dú)給擴(kuò)展添加的成員設(shè)置訪問級(jí)別
4、不能給用于遵守協(xié)議的擴(kuò)展顯式設(shè)置擴(kuò)展的訪問級(jí)別
5、在同一文件中的擴(kuò)展,可以寫成類似多個(gè)部分的類型聲明
- 在原本的聲明中聲明一個(gè)私有成員,可以在同一文件的擴(kuò)展中訪問他
- 在擴(kuò)展中聲明一個(gè)私有成員,可以在同一文件的其他擴(kuò)展中、原本生明中訪問他
將方法賦值給var\let
1、方法也可以像函數(shù)那樣,賦值給一個(gè)let或者var
struct Person {
var age: Int
func run(_ v: Int) {
print("func run", age, v)
}
}
var fn: (Person) -> (Int) -> () = Person.run(_:)
fn(Person(age: 10))(20)
一些補(bǔ)充知識(shí)
CustomStringConvertible
1、遵守CustomStringConvertible、CustomDebugStringConvertible協(xié)議,都可以自定義實(shí)例的打印字符串
class Person: CustomStringConvertible, CustomDebugStringConvertible {
var age = 0
var description: String {
"person_\(age)"
}
var debugDescription: String {
"debug_person_\(age)"
}
}
2、print調(diào)用的是CustomStringConvertible協(xié)議的description
3、debugPrint、po調(diào)用的是CustomDebugStringConvertible協(xié)議的debugDescription
Self
1、Self一般用作返回值類型,限定返回值跟方法調(diào)用者必須是同一類型(也可以作為參數(shù)類型)
2、Self代表當(dāng)前類型
class Person {
var age = 1
static var count = 2
func run() {
print(self.age) // 1
print(Self.count) // 2
}
}
assert (斷言)
1、很多編程語(yǔ)言都有斷言機(jī)制:不符合指定條件就拋出運(yùn)行時(shí)錯(cuò)誤,常用語(yǔ)調(diào)試(Debug)階段的條件判斷
2、默認(rèn)情況下,Swift的斷言只會(huì)在debug模式下生效,release模式下會(huì)忽略
func divide(_ v1: Int, _ v2: Int) -> Int {
assert(v2 != 0, "除數(shù)不能為0")
return v1 / v2
}
fatalError
1、如果遇到嚴(yán)重問題,希望結(jié)束程序運(yùn)行時(shí),可以直接使用fatalError函數(shù)拋出錯(cuò)誤(這是無(wú)法通過do-catch捕捉的錯(cuò)誤)
2、使用了fatalError函數(shù),就不需要再寫return
func test(_ num: Int) -> Int {
if num >= 0 {
return 1
}
fatalError("num不能小于0")
}
3、在某些不得不實(shí)現(xiàn),但不希望別人調(diào)用的方法,可以考慮內(nèi)部使用fatalError函數(shù)
class Person {
required init() {}
}
class Student: Person {
required init() {
fatalError("don't call Student init()")
}
init(score: Int) {}
}
var stu1 = Student(score: 98)
var stu2 = Student()
原文鏈接:https://blog.csdn.net/run_in_road/article/details/126691679
相關(guān)推薦
- 2022-11-24 GoLang切片相關(guān)問題梳理講解_Golang
- 2022-12-07 React中路由的參數(shù)傳遞路由的配置文件詳解_React
- 2022-05-01 C#使用log4net打日志_C#教程
- 2022-03-18 C語(yǔ)言回溯法解八皇后問題(八皇后算法)_C 語(yǔ)言
- 2023-03-29 python中文字符如何轉(zhuǎn)url編碼_python
- 2022-09-01 Nginx?部署的虛擬主機(jī)使用?Let's?Encrypt?加密?https的方法_nginx
- 2022-10-15 詳解C++中常用的四種類型轉(zhuǎn)換方式_C 語(yǔ)言
- 2022-02-11 g2繪制點(diǎn)圖,鼠標(biāo)移入點(diǎn)上出現(xiàn)tooltip,對(duì)應(yīng)的label消失
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支