級別: ★☆☆☆☆
標簽:「iOS」「Swift 5.1」「實例方法」「類方法」「mutating」
作者: 沐靈洛
審校: QiShare團隊
方法
方法是與特定類型相關聯的函數。Swift中類,結構體和枚舉都可以定義實例方法,這些方法封裝了用于處理特定類型實例的特定任務和功能。同時類,結構體和枚舉也都可以定義類型方法,與類型本身關聯。
Swift中結構體和枚舉可以定義方法這是與C和Objective-C的主要區別。
實例方法
實例方法是屬于特定的類,結構體或枚舉類型的實例的函數。實例方法與函數具有完全相同的語法。實例方法可以隱式訪問該類型的所有其他實例方法和屬性。實例方法只能在其所屬類型的特定實例上調用。
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
//調用
let counter = Counter() //!< count : 0
counter.increment()//!<count : 1
counter.increment(by: 5)//!< count : 6
counter.reset()//!< count : 0
self
屬性
類型的每個實例都有一個self
的隱式屬性,self
與實例本身完全等效。使用self
屬性在其自己的實例方法中引用當前實例對象。
大多數情況下對于某個特定的類型,我們可以不用在其實例方法中使用self
屬性去引用該實例的屬性或者調用其他方法。因為當我們沒有明確使用self
引用已知屬性或方法時,Swift會自動推斷為當前類型的實例。但是當我們的實例方法的參數名稱和屬性的名稱相同時,在方法內部,參數名具有一定的優先權。若是需要使用屬性,則需要明確使用self
來引用屬性,以區分參數。
實例方法中修改值類型
結構和枚舉是值類型。默認情況下,無法在其實例方法中修改值類型的屬性。
如果需要在特定方法中修改枚舉或結構體中定義的屬性,使用mutating
關鍵字放在枚舉或結構體中所定義方法的func
關鍵字之前,使得該方法可以在方法中修改枚舉或結構體的屬性,并且當方法結束時,它所做的任何更改都將寫回原始數據結構中。該方法還可以為其隱式self
屬性分配一個全新的實例,并且該self
所表示的新實例將在方法結束時替換現有實例。
struct Point {
var x = 0.0, y = 0.0 //!< 必須變量,常量不能被修改
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("當前點: (\(somePoint.x), \(somePoint.y))")//!< 當前點: (3.0, 4.0)"
類型的mutating
方法中給隱式的self
屬性賦值
值類型:結構體
struct Point {
var x = 0.0, y = 0.0 //!< 必須變量,常量不能被修改
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point.init(x: x + deltaX, y: y + deltaY)
}
}
值類型:枚舉類型
enum SizeType:Int,CaseIterable {
case big,middle,small
mutating func nextCase() {
switch self {
case .big:
self = .middle
case .middle:
self = .small
case .small:
self = .big
}
}
}
//使用
let sizeType = SizeType.allCases
for var item in sizeType {
print("當前的item:\(item)")
item.nextCase()
print("調用方法后:\(item)")
}
類型方法
類型方法:使用類型本身而不是類型的實例去調用的方法。
類型方法的表示:在func
關鍵字的前面加static
關鍵字;若當前的類型是類類型時,也可以使用class
關鍵字,對類類型使用class
關鍵字時,表示允許子類重寫父類的方法實現。
class SomeClass {
//定義
class func someTypeMethod() {
//類方法的實現
}
}
//調用
SomeClass.someTypeMethod()
在類型方法中,隱式的self
屬性引用的是類型本身而不再是類型的實例。這意味著我們可以使用self
屬性來消除類屬性和類型方法參數之間的歧義。
函數or方法的聲明屬性@discardableResult
@discardableResult
將此屬性應用于函數或方法聲明前,表示雖然該函數有返回值,但如果不使用返回值,編譯器不應生成警告。
override init() {
super.init()
instanceMethod()
}
@discardableResult
func instanceMethod() -> String {
return "返回值是一個字符串,但是調用處卻不會使用,使用聲明屬性`@discardableResult`避免編譯器的警告"
}
返回值是一個字符串,但是調用處卻不會使用,使用聲明屬性@discardableResult
避免編譯器的警告。
參考資料:
swift 5.1官方編程指南
推薦文章:
Swift 5.1 (10) - 屬性
iOS App后臺保活
Swift 中使用 CGAffineTransform
iOS 性能監控(一)—— CPU功耗監控
iOS 性能監控(二)—— 主線程卡頓監控
iOS 性能監控(三)—— 方法耗時監控
初識Flutter web
用SwiftUI給視圖添加動畫
用SwiftUI寫一個簡單頁面
iOS App啟動優化(三)—— 自己做一個工具監控App的啟動耗時
iOS App啟動優化(二)—— 使用“Time Profiler”工具監控App的啟動耗時
iOS App啟動優化(一)—— 了解App的啟動流程