Swift基础入门知识学习(16)-方法-讲给你懂
作者:互联网
目录
Swift基础入门知识学习(16)-方法-讲给你懂
理解难度
★★☆☆☆
实用程度
★★★★☆
结构體内部可以有函数,这些函数可以根据需要使用结构體的属性。
结构體中的函数称为「方法」,而且仍然使用相同的func关键字。
方法(method)為特定型別(類型、結構體或枚舉)的函數,可以分為兩種:
- 實例方法(instance method):先需要生成一個特定型別(類型、結構體或枚舉)的實例,才能使用這個實例裡的方法。
- 類型方法(type method):屬於特定型別(類型、結構體或枚舉)本身的方法。
實例方法
實例方法(instance method)是屬於一個特定型別(類型、結構體或枚舉)的實例,可以用來存取和設置實例屬性或是提供實例需要的功能。
實例方法的語法跟使用方式與前面提到的函數一樣,使用 func 關鍵字建立,並需要放在這個定義的特定型別(類型、結構體或枚舉)的大括號{ }內。
// 定義一個類型 Stepper
class Stepper {
// 定義一個變數屬性 預設值為零
var count = 0
// 定義一個實例方法 會將變數屬性加一
func addTo() {
count += 1
}
// 定義一個實例方法 會將變數屬性加上一個傳入的數字
func addTo(by amount: Int) {
count += amount
}
// 定義一個實例方法 會將變數屬性歸零
func reset() {
count = 0
}
}
上面的代碼中,定義了一個簡單的計數器的類型,如果要呼叫方法的話,也是像屬性一樣使用點語法(dot syntax),如下:
// 生成一個實例 stepper 其內的計數值屬性初始化為 0
let stepper = Stepper()
// 呼叫其內的一個實例方法 現在計數值為 1
stepper.addTo()
// 呼叫其內的一個實例方法, 傳入一個參數 9, 現在計數值為 10
stepper.addTo(by: 9)
// 呼叫其內的一個實例方法, 將計數值歸零, 現在計數值為 0
stepper.reset()
實例方法(instance method)的參數定義方式與前面章節提到的函數相似,一樣需要有參數標籤(argument label)及參數名稱(parameter name)。
內建屬性 self
每一個實例都有一個內建的隱藏屬性self,來代表這個實例本身。可以在實例方法中使用self來代表這個實例,如下:
// 將前面定義的類型 Stepper 裡的 addTo 方法作修改
func addTo() {
self.count += 1
}
不過實際上,self不會經常使用到,因為在一個方法中使用一個已知的屬性或方法時,Swift 都會將其當做目前這個實例的屬性或方法。
而有一個情況是,當一個實例方法的參數名稱與實例的一個屬性名稱相同時(像是方法的參數名稱為count,而屬性也命名為count),這時在這個方法中使用count的話,都會將其當做參數,除非加上self為self.count,才會當做是實例的屬性。
在实例方法中修改值类型
Swift 语言中结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异方法(mutating),然后就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。
方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
struct area {
var length = 1
var breadth = 1
func area() -> Int {
return length * breadth
}
mutating func scaleBy(res: Int) {
length *= res
breadth *= res
print(length)
print(breadth)
}
}
var val = area(length: 3, breadth: 5)
val.scaleBy(res: 3)
val.scaleBy(res: 30)
val.scaleBy(res: 300)
在可变方法中给 self 赋值
可变方法能够赋给隐含属性 self 一个全新的实例。
struct area {
var length = 1
var breadth = 1
func area() -> Int {
return length * breadth
}
mutating func scaleBy(res: Int) {
self.length *= res
self.breadth *= res
print(length)
print(breadth)
}
}
var val = area(length: 3, breadth: 5)
val.scaleBy(res: 13)
類型方法
類型方法(type method)為定義在特定型別(類型、結構體與枚舉)上的方法。不是屬於實例,而是屬於這個型別(類型、結構體或枚舉)本身的方法,與實例方法一樣使用點語法(dot syntax)呼叫。
聲明類型方法時需要在 func 前加上關鍵字 static。而以類型來說,還可以將static替換成 class 來允許子類型覆寫(override)父類型的類型方法。
例子如下:
// 定義一個類型
class Class1 {
// 定義一個類型方法
class func someTypeMethod() {
print("類型方法")
}
}
// 呼叫一個類型方法
Class1.someTypeMethod()
上面的代碼中可以看到,不用生成實例就可以直接呼叫類型方法,因為類型方法是屬於一個特定型別(類型、結構體與枚舉)而不是一個實例。
函数和方法有什么区别?
Swift 的函數允许我们命名一个功能并反复运行它,Swift 的方法也做同样的事情。那么到底有什么区别呢?
其實,唯一真正的区别是,方法属于一种类型,如结构體、枚举和类,而函数不属于。就是这样!这是唯一的区别。
两者都可以接受任意数量的参数,包括变量参数,并且都可以返回值。莫名其妙,它们基本上就是一樣的東西,而且 Swift 還使用 func 关键字来定义方法。
簡單來說,就名稱說法不同,在 func 关键字裡面的,基本上就是一樣。
标签:屬性,入门,16,Swift,類型,func,一個,實例,方法 来源: https://blog.csdn.net/weixin_42385177/article/details/121803593