級別: ★☆☆☆☆
標籤:「iOS」「Swift 5.1」「實例方法」「類方法」「mutating」
做者: 沐靈洛
審校: QiShare團隊php
方法是與特定類型相關聯的函數。Swift中類,結構體和枚舉均可以定義實例方法,這些方法封裝了用於處理特定類型實例的特定任務和功能。同時類,結構體和枚舉也均可以定義類型方法,與類型自己關聯。 Swift中結構體和枚舉能夠定義方法這是與C和Objective-C的主要區別。git
實例方法是屬於特定的類,結構體或枚舉類型的實例的函數。實例方法與函數具備徹底相同的語法。實例方法能夠隱式訪問該類型的全部其餘實例方法和屬性。實例方法只能在其所屬類型的特定實例上調用。github
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
屬性web
類型的每一個實例都有一個self
的隱式屬性,self
與實例自己徹底等效。使用self
屬性在其本身的實例方法中引用當前實例對象。 大多數狀況下對於某個特定的類型,咱們能夠不用在其實例方法中使用self
屬性去引用該實例的屬性或者調用其餘方法。由於當咱們沒有明確使用self
引用已知屬性或方法時,Swift會自動推斷爲當前類型的實例。可是當咱們的實例方法的參數名稱和屬性的名稱相同時,在方法內部,參數名具備必定的優先權。如果須要使用屬性,則須要明確使用self
來引用屬性,以區分參數。編程
實例方法中修改值類型swift
結構和枚舉是值類型。默認狀況下,沒法在其實例方法中修改值類型的屬性。 若是須要在特定方法中修改枚舉或結構體中定義的屬性,使用mutating
關鍵字放在枚舉或結構體中所定義方法的func
關鍵字以前,使得該方法能夠在方法中修改枚舉或結構體的屬性,而且當方法結束時,它所作的任何更改都將寫回原始數據結構中。該方法還能夠爲其隱式self
屬性分配一個全新的實例,而且該self
所表示的新實例將在方法結束時替換現有實例。bash
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)
}
}
複製代碼
值類型:枚舉類型ide
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
屬性來消除類屬性和類型方法參數之間的歧義。
@discardableResult
@discardableResult
將此屬性應用於函數或方法聲明前,表示雖然該函數有返回值,但若是不使用返回值,編譯器不該生成警告。
override init() {
super.init()
instanceMethod()
}
@discardableResult
func instanceMethod() -> String {
return "返回值是一個字符串,可是調用處卻不會使用,使用聲明屬性`@discardableResult`避免編譯器的警告"
}
複製代碼
返回值是一個字符串,可是調用處卻不會使用,使用聲明屬性@discardableResult
避免編譯器的警告。
參考資料: swift 5.1官方編程指南
小編微信:可加並拉入《QiShare技術交流羣》。
關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)
推薦文章:
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的啓動流程
奇舞週刊