詳解Swift面向?qū)ο缶幊讨械姆椒?method)
struct Point {
var x:Double
var y:Double
mutating func move(x:Double,y:Double) {
self = Point(x: self.x+x,y: self.y+y)
}
static func name(){
print("Point")
}
}
Point.name()
一、引言
方法只是一個術(shù)語,其實(shí)就是將函數(shù)與特定的類型結(jié)合,類、結(jié)構(gòu)體、枚舉都可以定義方法,方法又分為實(shí)例方法和類型方法,類型方法類似于Objective-C中的類方法。Swift和Objective-C的一大不同是,Objective-C只有在類中可以定義方法。
二、實(shí)例方法基礎(chǔ)
實(shí)例方法的語法和函數(shù)完全一致,其和具體類型的實(shí)例所關(guān)聯(lián),實(shí)例方法在調(diào)用時由類型的實(shí)例點(diǎn)語法進(jìn)行調(diào)用來完成一些功能模塊。示例如下:
class Math {
//完成加法功能的實(shí)例方法
func add(param1:Double,param2:Double)->Double{
return param1+param2
}
}
//創(chuàng)建類型實(shí)例
var obj = Math()
//調(diào)用方法進(jìn)行計(jì)算
obj.add(5, param2: 5)
與Objective-C類似,Swift中每一個類的實(shí)例中都隱藏含有一個self屬性,self屬性就是實(shí)例本身,開發(fā)者可以在實(shí)例方法中使用self來調(diào)用屬性或者其他實(shí)例方法,示例如下:
class Math {
//完成加法功能的實(shí)例方法
func add(param1:Double,param2:Double)->Double{
return param1+param2
}
func mul(param1:Double,param2:Double) -> Double {
//使用self調(diào)用實(shí)例方法
self.add(param1, param2: param2)
return param1*param2
}
}
然而,Swift并不要求開發(fā)者必須寫self,默認(rèn)情況下,開發(fā)者可以直接省略self來調(diào)用屬性和方法:
class Math {
//完成加法功能的實(shí)例方法
func add(param1:Double,param2:Double)->Double{
return param1+param2
}
func mul(param1:Double,param2:Double) -> Double {
//使用self調(diào)用實(shí)例方法
add(param1, param2: param2)
return param1*param2
}
}
有一種情況需要注意,對于屬性的調(diào)用,如果方法中的參數(shù)名和類實(shí)例的屬性名相同,則必須使用self來調(diào)用類的實(shí)例屬性,防止歧義的產(chǎn)生:
class Math {
var param1 = 10.0
//完成加法功能的實(shí)例方法
func add(param1:Double,param2:Double)->Double{
//這里將使用param1=10,如果不加self 將使用參數(shù)中的param1
return self.param1+param2
}
func mul(param1:Double,param2:Double) -> Double {
//使用self調(diào)用實(shí)例方法
add(param1, param2: param2)
return param1*param2
}
}
三、在實(shí)例方法中修改值類型的值
首先需要清楚一個概念,Swift中有兩種類型,值類型和引用類型,具體在類、結(jié)構(gòu)體、枚舉一節(jié)中有相關(guān)介紹,這里需要注意的是,對于值類型,即結(jié)構(gòu)體和枚舉,其并不能直接在實(shí)例方法中修改實(shí)例屬性的值,Swift中提供了另一種方式,如果真有如此的需求,開發(fā)者可以使用mutating關(guān)鍵字將實(shí)例方法聲明成可變的,實(shí)際上,如果在可變的實(shí)例方法中修改了值類型屬性的值,是會創(chuàng)建一個新的實(shí)例來代替原來的實(shí)例的,示例如下:
struct Point {
var x:Double
var y:Double
mutating func move(x:Double,y:Double) {
self.x+=x
self.y+=y
}
}
var point = Point(x: 1, y: 1)
print(point)
point.move(3, y: 3)
print(point)
在值類型實(shí)例的可變方法中修改屬性的值,實(shí)際上就是創(chuàng)建了一個新的實(shí)例,上面的寫法和下面的寫法原理是一樣的:
struct Point {
var x:Double
var y:Double
mutating func move(x:Double,y:Double) {
self = Point(x: self.x+x,y: self.y+y)
}
}
四、類型方法
正如實(shí)例方法是通過類型的實(shí)例來進(jìn)行調(diào)用的,類型方法是通過類型直接來調(diào)用的,相比于實(shí)例方法,類型方法中的self指當(dāng)前類型,同樣開發(fā)者可以使用self來區(qū)別類型屬性和類型方法中的參數(shù)。使用Static關(guān)鍵字來進(jìn)行類型方法的創(chuàng)建:
如果是在類中創(chuàng)建類型方法,若此方法可以被子類進(jìn)行重寫,則應(yīng)該使用class關(guān)鍵字來創(chuàng)建,示例如下:
class Math {
var param1 = 10.0
//完成加法功能的實(shí)例方法
func add(param1:Double,param2:Double)->Double{
//這里將使用param1=10,如果不加self 將使用參數(shù)中的param1
return self.param1+param2
}
func mul(param1:Double,param2:Double) -> Double {
//使用self調(diào)用實(shí)例方法
add(param1, param2: param2)
return param1*param2
}
class func name(){
print("Math")
}
}
Math.name()
相關(guān)文章
用SwiftUI實(shí)現(xiàn)3D Scroll滾動效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了用SwiftUI實(shí)現(xiàn)3D Scroll效果的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2020-04-04
SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動畫
這篇文章主要介紹了SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動畫,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-05-05
Swift Extension擴(kuò)展得使用詳細(xì)介紹
在swift中,extension與Objective-C的category有點(diǎn)類似,但是extension比起category來說更加強(qiáng)大和靈活,它不僅可以擴(kuò)展某種類型或結(jié)構(gòu)體的方法,同時它還可以與protocol等結(jié)合使用,編寫出更加靈活和強(qiáng)大的代碼2022-09-09
淺談在Swift中關(guān)于函數(shù)指針的實(shí)現(xiàn)
這篇文章主要介紹了淺談在Swift中關(guān)于函數(shù)指針的實(shí)現(xiàn),是作者根據(jù)C語言的指針特性在Swifft中做出的一個實(shí)驗(yàn),需要的朋友可以參考下2015-07-07
詳談swift內(nèi)存管理中的引用計(jì)數(shù)
下面小編就為大家?guī)硪黄斦剆wift內(nèi)存管理中的引用計(jì)數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

