swift. 扩展类添加属性_swift中的声明关键字详解
原起
學習swift,swift中的關鍵字當然要了解清楚了,最近在網(wǎng)上看到了關于聲明關鍵字的文章,整理記錄一下。
關鍵字是類似于標識符的保留字符序列,除非用重音符號(`)將其括起來,否則不能用作標識符。關鍵字是對編譯器具有特殊意義的預定義保留標識符。
常見的關鍵字有以下4種:
- 與聲明有關的關鍵字:class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias和var。
- 與語句有關的關鍵字:break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where和while。
- 表達式和類型關鍵字:as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__和__LINE__。
- 在特定上下文中使用的關鍵字:associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、rightset、unowned、unowned(safe)、unowned(unsafe)、weak和willSet。
聲明關鍵字一覽圖
swift常見的聲明關鍵字整理如下(不想看長文的,直接看下圖即可)
聲明關鍵字概覽圖
聲明關鍵字詳解
1、class
在swift中,我們使用class關鍵字去聲明一個類或者類方法。
class Person: NSObject { /// add `class` key word before function, this function become a class function class func work(){ print("everyone need work!") }}這樣我們就聲明了一個Person類。
2、let
swift里有l(wèi)et關鍵字聲明一個常量,及我們不可以對他進行修改。(注意:我們用let修飾的常量是一個類, 我們可以對其所在的屬性進行修改)
class iOSer: Person{ let name: String = "ningjianwen" var age: Int = 30 var height: Float = 170}let ITWork: iOSer = iOSer()ITWork.age = 25print("老子希望永遠25歲")在iOSer類中l(wèi)et聲明的name不可修改,var聲明的age&height可以修改。同時let關鍵字聲明的ITWork實例不可變,但是內(nèi)部的var關鍵字聲明的刷新是可以修改的。
3、var
swift中var修飾的變量是一個可變的變量,可以對她的值進行修改。
注意:我們不會用var去引用一個類, 也沒有必要。
func iOSerClassFunction(){ let ITWork: iOSer = iOSer() ITWork.age = 25 print("老子希望永遠(ITWork.age)歲") let iOS1 = ITWork iOS1.age = 18 print("iOS1 age =(iOS1.age)") print("ITWork age = (ITWork.age)") } /** 打印結果 老子希望永遠25歲 iOS1 age =18 ITWork age = 18 */從結果可以看出對iOS1的修改同樣影響了ITWork,說明兩個對象指向同一塊內(nèi)存空間。
4、struct
在Swift中, 我們使用struct關鍵字去聲明結構體,Swift中的結構體并不復雜,與C語言的結構體相比,除了成員變量,還多了成員方法。使得它更加接近于一個類。可以把struct看作是類的一個輕量化實現(xiàn)。
struct Student { var name: String var age: Int func introduce(){ print("我叫:(name),今年(age)歲") }}從上方的代碼可以看出,結構體和類擁有相同的功能,可以定義屬性和方法。但是二者的內(nèi)存管理方式有所不同,class屬于引用類型,而struct屬于值類型。
swift中的結構體語法上與C語言或者OC類似,只不過Swift中的結構體,在定義成員變量時一定要注明類型。
5、enum
在Swift中, 我們使用enum關鍵字去聲明枚舉。枚舉是一種常見的數(shù)據(jù)類型,他的主要功能就是將某一種有固定數(shù)量可能性的變量的值,以一組命名過的常數(shù)來指代。比如正常情況下方向有四種可能,東,南,西,北。我們就可以聲明一組常量來指代方向的四種可能。使用枚舉可以防止用戶使用無效值,同時該變量可以使代碼更加清晰。
enum Orientation: Int{ case East case South case West case North /** 或者 enum Orientation:Int{ case East,South,West,North } */}print(Orientation.East.rawValue)/** 輸出結果 0 */注意:我們在定義枚舉時,一定要指定類型,否則在使用時就會報錯。枚舉類型的值如果沒有賦值,他就按照默認的走,可以賦予我們自己想要的值。
6、final
final關鍵字可以在class、func、var前修飾,表示不可重寫,可以把類或者類中的部分實現(xiàn)保護起來,從而避免子類破壞。
class Fruit : NSObject { //修飾詞 final 表示 不可重寫 可以將類或者類中的部分實現(xiàn)保護起來,從而避免子類破壞 final func price(){ //something price code here //... }}class Apple: Fruit {// 此處重寫`final`修飾的price方法,報錯 “Instance method overrides a 'final' instance method”// override func price(){ }}7、override
在Swift中, 如果我們要重寫某個方法, 或者某個屬性的話, 我們需要在重寫的變量前增加一個override關鍵字。
class Fruit : NSObject { var sellPrice: Double = 0.0 var name: String = "fruit" func info(){ print("this fruit name is fruit") } //修飾詞 final 表示 不可重寫 可以將類或者類中的部分實現(xiàn)保護起來,從而避免子類破壞 final func price(){ //something price code here //... }}class Apple: Fruit { func eat(){ print("eat fruit") } //重寫info方法 override func info() { print("this fruit name is (super.name)") } //重寫name屬性 override var name: String{ set{ super.name = newValue } get{ return super.name } }}8、subscript
在swift中,subscript關鍵字表示下標,可以讓class、struct、以及enum使用下標訪問內(nèi)部的值。其實就可以快捷方式的設置或者獲取對應的屬性, 而不需要調(diào)用對應的方法去獲取或者存儲, 比如官網(wǎng)的一個實例:
struct Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0, count: rows * columns) } func indexIsValid(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } //實現(xiàn)`subscript`方法 subscript(row: Int, column: Int) -> Double { get { assert(indexIsValid(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { assert(indexIsValid(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } }}func matrixTest(){ var matrix = Matrix(rows: 2, columns: 2) matrix[0, 1] = 1.5 matrix[1, 0] = 3.2 print("matrix == (matrix)") /** 打印結果: matrix == Matrix(rows: 2, columns: 2, grid: [0.0, 1.5, 3.2, 0.0]) */ }9、static
在swift中,我們用static關鍵字聲明靜態(tài)變量或者函數(shù),它保證在對應的作用域當中只有一份, 同時也不需要依賴實例化。
注意:(用static關鍵字指定的方法是類方法,他是不能被子類重寫的)
10、mutating
mutating關鍵字指的是可變即可修改。用在structure和enumeration中,雖然結構體和枚舉可以定義自己的方法,但是默認情況下,實例方法中是不可以修改值類型的屬性。為了能夠在實例方法中修改屬性值,可以在方法定義前添加關鍵字mutating。
11、typealias
使用關鍵字typealias定義類型別名(typealias就相當于objective-c中的typedef),就是將類型重命名,看起來更加語義化。說人話就是:起別名。
typealias Width = Floattypealias Height = Floatfunc rectangularArea(width:Width, height:Height) -> Double { return Double(width*height) }12、lazy
lazy關鍵修飾的變量, 只有在第一次被調(diào)用的時候才會去初始化值(即懶加載)。這個在定義屬性經(jīng)常會用到,為了提高程序的性能,我們把它定義成lazy的,等待真正需要的時候采取加載。
lazy var titleLabel: UILabel = { var lab = UILabel() lab.frame = CGRect(x: 50, y: 100, width: 200, height: 20) lab.textAlignment = .center lab.font = UIFont.systemFont(ofSize: 18) lab.textColor = UIColor.blue return lab }()13、init
init關鍵字也表示構造器,初始化方法,在init后面加個”?”號, 表明該構造器可以允許失敗。
class PerSon { var name:String init?(name : String) { if name.isEmpty { return nil } self.name = name } }14、required
required是用來修飾init方法的,說明該構造方法是必須實現(xiàn)的。
class Father: NSObject { var name: String? required init(name: String) { self.name = name }}class Son: Father { required init(name: String) { super.init(name: name) self.name = name }}從上面的代碼示例中不難看出,如果子類需要添加異于父類的初始化方法時,必須先要實現(xiàn)父類中使用required修飾符修飾過的初始化方法,并且也要使用required修飾符而不是override。
使用required的注意點:
- required修飾符只能用于修飾類初始化方法。
- 當子類含有異于父類的初始化方法時(初始化方法參數(shù)類型和數(shù)量異于父類),子類必須要實現(xiàn)父類的required初始化方法,并且也要使用required修飾符而不是override。
- 當子類沒有初始化方法時,可以不用實現(xiàn)父類的required初始化方法。
15、extension
extension與Objective-C的category有點類似,但是extension比起category來說更加強大和靈活,它不僅可以擴展某種類型或結構體的方法,同時它還可以與protocol等結合使用,編寫出更加靈活和強大的代碼。它可以為特定的class, strut, enum或者protocol添加新的特性。當你沒有權限對源代碼進行改造的時候,此時可以通過extension來對類型進行擴展。extension有點類似于OC的類別 -- category,但稍微不同的是category有名字,而extension沒有名字。
extension也是swift開發(fā)經(jīng)常用到的,它可以擴展擴展以下幾個:
- 1. 定義實例方法和類型方法
- 2. 添加計算型屬性和計算靜態(tài)屬性
- 3. 定義下標
- 4. 提供新的構造器
- 5. 定義和使用新的嵌套類型
- 6. 使一個已有類型符合某個接口
16、convenience
使用convenience修飾的構造函數(shù)叫做便利構造函數(shù) 。便利構造函數(shù)通常用在對系統(tǒng)的類進行構造函數(shù)的擴充時使用。
便利構造函數(shù)的特點如下:
- 1. 便利構造函數(shù)通常都是寫在extension里面
- 2. 便利函數(shù)init前面需要加載convenience
- 3. 在便利構造函數(shù)中需要明確的調(diào)用self.init()
17、deinit
deinit屬于析構函數(shù),當對象結束其生命周期時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動執(zhí)行析構函數(shù)。和OC中的dealloc 一樣的。
我們通常在deinit函數(shù)中進行一些資源釋放和通知移除等。
列舉如下:
- 1. 對象銷毀
- 2. KVO移除
- 3. 移除通知
- 4. NSTimer銷毀
18、fallthrough
在swift中,fallthrough的作用是就是在switch-case中執(zhí)行完當前case,繼續(xù)執(zhí)行下面的case.
19、protocol
在swift中,protocol也是定義協(xié)議的,用法和OC類似。
20、open
open修飾的對象表示可以被任何人使用,包括override和繼承。
21、public
在swift中,public表示公有訪問權限,類或者類的公有屬性或者公有方法可以從文件或者模塊的任何地方進行訪問。但在其他模塊(一個App就是一個模塊,一個第三方API, 第三等方框架等都是一個完整的模塊)不可以被override和繼承,而在本模塊內(nèi)可以被override和繼承。
22、internal
在swift中,internal表示內(nèi)部的訪問權限。即有著internal訪問權限的屬性和方法說明在模塊內(nèi)部可以訪問,超出模塊內(nèi)部就不可被訪問了。在swift中默認就是internal的訪問權限。
23、private
在swift中,private表示私有訪問權限。被private修飾的類或者類的屬性或方法可以在同一個物理文件中訪問。如果超出該物理文件,那么有著private訪問權限的屬性和方法就不能被訪問。
24、fileprivate
在swift中,fileprivate訪問級別所修飾的屬性或者方法在當前的Swift源文件里可以訪問。
下面的代碼是對internal,private,fileprivate的一個簡單展示。
/// 默認是internal的訪問權限,在模塊內(nèi)部可以訪問class ParentClass: NSObject { ///這個方法在如何地方可以被`override` func speak(){ print("這是一個說話屬性,子類可以進行復寫") } /// 這個方法是秘密,只有父類擁有,子類不可修改 private func secret(){ print("這是一個秘密,只有我自己知道") } /// 這是本類的秘密,出了該類就看不到了 fileprivate func localSecret(){ print("這是本類的秘密,出了該類就看不到了") }}class FirstSon: ParentClass { /// 長子說話 override func speak() { print("我是長子") }//長子也不能修改老爸的秘密// override func secret(){ } override func localSecret() { print("兒子把家里的秘密說出去了") }}//方法調(diào)用與及結果打印func parentClassTest(){ let parent: ParentClass = ParentClass() parent.speak()// parent.secret() //老爸的秘密不能對外// parent.localSecret() //家里的秘密也不能對外 let oldSon: FirstSon = FirstSon() oldSon.speak()// oldSon.secret() //兒子不能說老爸的秘密 oldSon.localSecret() //兒子把家里的秘密說出去了 /** 打印結果 這是一個說話屬性,子類可以進行復寫 我是長子 兒子把家里的秘密說出去了 */ }說明:5種修飾符訪問權限排序open > public > internal > fileprivate > private.
從類的安全性上來說,訪問權限越小越好。
SwiftStatementDemo
https://github.com/ningjianwen/SwiftStatementDemo.git參考:swift中的關鍵字詳解
https://www.cnblogs.com/liYongJun0526/p/7522130.html總結
以上是生活随笔為你收集整理的swift. 扩展类添加属性_swift中的声明关键字详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python神经网络多元函数_阿里达摩院
- 下一篇: php+html5+jquery断点续传