Swift 方法是與某些特定類型相關(guān)聯(lián)的函數(shù)
在 Objective-C 中撕氧,類是唯一能定義方法的類型。但在 Swift 中估脆,你不僅能選擇是否要定義一個(gè)類/結(jié)構(gòu)體/枚舉嚎杨,還能靈活的在你創(chuàng)建的類型(類/結(jié)構(gòu)體/枚舉)上定義方法。
實(shí)例方法
在 Swift 語言中发侵,實(shí)例方法是屬于某個(gè)特定類交掏、結(jié)構(gòu)體或者枚舉類型實(shí)例的方法。
實(shí)例方法提供以下方法:
可以訪問和修改實(shí)例屬性
提供與實(shí)例目的相關(guān)的功能
實(shí)例方法要寫在它所屬的類型的前后大括號({})之間刃鳄。
實(shí)例方法能夠隱式訪問它所屬類型的所有的其他實(shí)例方法和屬性盅弛。
實(shí)例方法只能被它所屬的類的某個(gè)特定實(shí)例調(diào)用。
實(shí)例方法不能脫離于現(xiàn)存的實(shí)例而被調(diào)用。
語法
func funcname(Parameters) -> returntype
{
Statement1
Statement2
……
Statement N
return parameters
}
實(shí)例
import Cocoa
class Counter {
var count = 0
func increment() {
count += 1
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
// 初始計(jì)數(shù)值是0
let counter = Counter()
// 計(jì)數(shù)值現(xiàn)在是1
counter.increment()
// 計(jì)數(shù)值現(xiàn)在是6
counter.incrementBy(amount: 5)
print(counter.count)
// 計(jì)數(shù)值現(xiàn)在是0
counter.reset()
print(counter.count)
以上程序執(zhí)行輸出結(jié)果為:
6
0
Counter類定義了三個(gè)實(shí)例方法:
increment 讓計(jì)數(shù)器按 1 遞增挪鹏;
incrementBy(amount: Int) 讓計(jì)數(shù)器按一個(gè)指定的整數(shù)值遞增见秽;
reset 將計(jì)數(shù)器重置為0。
Counter 這個(gè)類還聲明了一個(gè)可變屬性 count讨盒,用它來保持對當(dāng)前計(jì)數(shù)器值的追蹤解取。
方法的局部參數(shù)名稱和外部參數(shù)名稱
Swift 函數(shù)參數(shù)可以同時(shí)有一個(gè)局部名稱(在函數(shù)體內(nèi)部使用)和一個(gè)外部名稱(在調(diào)用函數(shù)時(shí)使用
Swift 中的方法和 Objective-C 中的方法極其相似。像在 Objective-C 中一樣返顺,Swift 中方法的名稱通常用一個(gè)介詞指向方法的第一個(gè)參數(shù)禀苦,比如:with,for遂鹊,by等等振乏。
Swift 默認(rèn)僅給方法的第一個(gè)參數(shù)名稱一個(gè)局部參數(shù)名稱;默認(rèn)同時(shí)給第二個(gè)和后續(xù)的參數(shù)名稱為全局參數(shù)名稱。
以下實(shí)例中 'no1' 在swift中聲明為局部參數(shù)名稱秉扑。'no2' 用于全局的聲明并通過外部程序訪問慧邮。
import Cocoa
class division {
var count: Int = 0
func incrementBy(no1: Int, no2: Int) {
count = no1 / no2
print(count)
}
}
let counter = division()
counter.incrementBy(no1: 1800, no2: 3)
counter.incrementBy(no1: 1600, no2: 5)
counter.incrementBy(no1: 11000, no2: 3)
以上程序執(zhí)行輸出結(jié)果為:
600
320
3666
是否提供外部名稱設(shè)置
我們強(qiáng)制在第一個(gè)參數(shù)添加外部名稱把這個(gè)局部名稱當(dāng)作外部名稱使用(Swift 2.0前是使用 # 號)。
相反舟陆,我們呢也可以使用下劃線(_)設(shè)置第二個(gè)及后續(xù)的參數(shù)不提供一個(gè)外部名稱误澳。
import Cocoa
class multiplication {
var count: Int = 0
func incrementBy(first no1: Int, no2: Int) {
count = no1 * no2
print(count)
}
}
let counter = multiplication()
counter.incrementBy(first: 800, no2: 3)
counter.incrementBy(first: 100, no2: 5)
counter.incrementBy(first: 15000, no2: 3)
以上程序執(zhí)行輸出結(jié)果為:
2400
500
45000
self 屬性
類型的每一個(gè)實(shí)例都有一個(gè)隱含屬性叫做self,self 完全等同于該實(shí)例本身秦躯。
你可以在一個(gè)實(shí)例的實(shí)例方法中使用這個(gè)隱含的self屬性來引用當(dāng)前實(shí)例脓匿。
import Cocoa
class calculations {
let a: Int
let b: Int
let res: Int
init(a: Int, b: Int) {
self.a = a
self.b = b
res = a + b
print("Self 內(nèi): \(res)")
}
func tot(c: Int) -> Int {
return res - c
}
func result() {
print("結(jié)果為: \(tot(c: 20))")
print("結(jié)果為: \(tot(c: 50))")
}
}
let pri = calculations(a: 600, b: 300)
let sum = calculations(a: 1200, b: 300)
pri.result()
sum.result()
以上程序執(zhí)行輸出結(jié)果為:
Self 內(nèi): 900
Self 內(nèi): 1500
結(jié)果為: 880
結(jié)果為: 850
結(jié)果為: 1480
結(jié)果為: 1450
在實(shí)例方法中修改值類型
Swift 語言中結(jié)構(gòu)體和枚舉是值類型。一般情況下宦赠,值類型的屬性不能在它的實(shí)例方法中被修改。
但是米母,如果你確實(shí)需要在某個(gè)具體的方法中修改結(jié)構(gòu)體或者枚舉的屬性勾扭,你可以選擇變異(mutating)這個(gè)方法,然后方法就可以從方法內(nèi)部改變它的屬性铁瞒;并且它做的任何改變在方法結(jié)束時(shí)還會保留在原始結(jié)構(gòu)中妙色。
方法還可以給它隱含的self屬性賦值一個(gè)全新的實(shí)例,這個(gè)新實(shí)例在方法結(jié)束后將替換原來的實(shí)例慧耍。
import Cocoa
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)
以上程序執(zhí)行輸出結(jié)果為:
9
15
270
450
81000
135000
在可變方法中給 self 賦值
可變方法能夠賦給隱含屬性 self 一個(gè)全新的實(shí)例身辨。
import Cocoa
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)
以上程序執(zhí)行輸出結(jié)果為:
39
65
類型方法
實(shí)例方法是被類型的某個(gè)實(shí)例調(diào)用的方法,你也可以定義類型本身調(diào)用的方法芍碧,這種方法就叫做類型方法煌珊。
聲明結(jié)構(gòu)體和枚舉的類型方法,在方法的func關(guān)鍵字之前加上關(guān)鍵字static泌豆。類可能會用關(guān)鍵字class來允許子類重寫父類的實(shí)現(xiàn)方法定庵。
類型方法和實(shí)例方法一樣用點(diǎn)號(.)語法調(diào)用。
import Cocoa
class Math
{
class func abs(number: Int) -> Int
{
if number < 0
{
return (-number)
}
else
{
return number
}
}
}
struct absno
{
static func abs(number: Int) -> Int
{
if number < 0
{
return (-number)
}
else
{
return number
}
}
}
let no = Math.abs(number: -35)
let num = absno.abs(number: -5)
print(no)
print(num)
以上程序執(zhí)行輸出結(jié)果為:
35
5