Swift基础入门知识学习16-方法-讲给你懂

超速学习-重点笔记

Swift基础入门知识学习(15)-属性-讲给你懂

目录


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 关键字裡面的,基本上就是一樣。

Swift基础入门知识学习(15)-属性-讲给你懂

超速学习-重点笔记

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...