Swift語言學習筆記(4)

2021-07-14 21:04:58 字數 3351 閱讀 7750

public class somepublicclass {}

internal class someinternalclass {}

fileprivate class somefileprivateclass {}

private class someprivateclass {}

// 常量,變數,函式的訪問級別

public var somepublicvariable = 0

internal let someinternalconstant = 0

fileprivate func somefileprivatefunction() {}

private func someprivatefunction() {}

// 預設的訪問級別

class someinternalclass {} // implicitly internal

let someinternalconstant = 0 // implicitly internal

單一模組的應用通常只需要使用預設的 internal 訪問級別。

框架的 api 應該使用 open 以及 public 訪問級別。

單元測試模組可以訪問應用程式模組中所有 internal 訪問級別的實體。

(需要@testable特性宣告該實體並且使用testing enabled編譯設定來編譯product模組)

訪問控制原則:任何實體都不能用低於自己的訪問級別的其他實體來定義。

型別的訪問級別會影響其成員(屬性,方法,構造器,下標)和巢狀型別的訪問級別。

file-private 以及 private 型別的成員和巢狀型別的預設訪問級別分別為 file-private 和 private。

public 或者 internal 型別的成員和巢狀型別的預設訪問級別為 internal。

// 預設訪問級別

public class somepublicclass // explicitly file-private class member

private func someprivatemethod() {} // explicitly private class member}

class someinternalclass // explicitly file-private class member

private func someprivatemethod() {} // explicitly private class member}

fileprivate class somefileprivateclass // implicitly file-private class member

private func someprivatemethod() {} // explicitly private class member}

private class someprivateclass // implicitly private class member

}

元組的訪問級別會被自動推導為元組成員中最低的訪問級別。

函式的訪問級別不得高於該函式的引數型別和返回型別的訪問級別。

private func somefunction() -> (someinternalclass, someprivateclass)

列舉中成員的訪問級別繼承自該列舉,不能單獨指定。

列舉的原始值和關聯值的訪問級別不能低於列舉的訪問級別。

子類的訪問級別不得高於父類的訪問級別。

但是子類成員的訪問級別可以高於它所覆蓋的父類成員的訪問級別。

只要符合訪問控制原則,子類成員甚至可以呼叫具有較高訪問級別的父類成員。

public class a 

}internal class b: a

}

public class a } 

internal class b: a

}

常量,變數,屬性不能擁有比自身型別更高的訪問級別。

下標的訪問級別不得高於該下標的索引型別和返回型別的訪問級別。

常量,變數,屬性,下標的getters和setters的訪問級別繼承自它們所屬的常量,變數,屬性,下標的訪問級別。

struct trackedstring 

}}var stringtoedit = trackedstring()

stringtoedit.value = "this string will be tracked."

stringtoedit.value += " this edit will increment numberofedits."

stringtoedit.value += " so will this one."

print("the number of edits is \(stringtoedit.numberofedits)")

// prints "the number of edits is 3"

public struct trackedstring

}public init() {}

}

自定義構造器的訪問級別可以低於或等於它所屬型別的訪問級別。

但是必要構造器的訪問級別必須和所屬型別的訪問級別相同。

private型別的預設構造器的訪問級別為private。

public或者internal型別的預設構造器的訪問級別為internal。

如果結構體中的任一儲存屬性的訪問級別為private,那麼它預設的成員逐一構造器訪問級別就是private。

否則該成員逐一構造器的訪問級別為internal。

協議中的所有需求(方法及屬性)都具有和該協議相同的訪問級別,不能單獨指定。

與其它型別不同的是,public訪問級別的協議中的所有需求也將是public訪問級別。

繼承了別的協議的協議所擁有的訪問級別最高也只能與被繼承協議的訪問級別相同。

採納了協議的型別的訪問級別取決於型別本身的訪問級別以及該型別所採納的任何協議的訪問級別中最低的一方。

擴充套件成員預設具有和原始型別成員相同的訪問級別。

採納了協議的擴充套件的成員的訪問級別與所採納協議的訪問級別相同,不能單獨指定。

泛型型別或泛型函式的訪問級別取決於以下訪問級別中最低的一方。

該泛型型別或泛型函式本身的訪問級別

任何施加於該泛型型別或泛型函式的型別引數之上的型別約束的訪問級別

乙個型別別名的訪問級別不可高於它所指向型別的訪問級別。

Swift語言學習筆記(四)

67.如果結構體 struct 的例項被宣告為常量的話,就不能對其屬性進行修改,即使是 var型別的屬性。而對於類 class 來說則不是這樣,如果乙個類的例項被宣告為常量,仍然可以修改其 var屬性。68.惰性屬性 lazy property 使用關鍵字 lazy 新增在宣告前面 惰性屬性在使用時...

C程式語言學習筆記(4)

還記得基礎 一 中提到了一點 的簡化嗎?將多個連續的空格用乙個空格代替的程式第二個版本。flag c 由於本人的c語言水平有限,還談不上能分析 的優化功能,目前就以簡化來分析自己 c語言心得。這篇只是簡單的介紹一下可以用簡潔的語言來實現功能,鍛鍊我們的c語言思維能力。先看乙個病毒程式,哈哈哈!也算是...

go語言學習筆記 4 變數

宣告 var變數名 型別 1 變數宣告關鍵字 2 變數宣告不用分號做結束符 3 多個變數的宣告 1 不同型別 var i int str string 2 同一型別,只要在最後加上型別即可 var v1,v2,v3 int 初始化 宣告的同時進行初始化 var可有可無,型別可有可無 有型別名 必須有...