Swift中的構造方法

2021-08-08 13:34:33 字數 3685 閱讀 6858

結構體和類在建立例項的過程中需要進行一些初始化的工作,這個過程被稱之為構造過程。同樣,這些例項在使用完成之後需要做一些清除工作,這個過程被稱之為析構過程。下面,我們來學習一下swift中的構造和析構。

1、建構函式

結構體和類在例項化的過程中會呼叫init()方法,而這個方法被稱之為建構函式。與objective-c中的建構函式不同,swift中建構函式沒有返回值,可以過載。通常情況下,在定義乙個類或者結構體時,不需要我們編寫建構函式,系統會提供乙個預設的建構函式:

class person 

struct student

// 例項化乙個person物件

let p = person()

p.age = 20

p.name = "lilei"

p.stu.no = 1701

p.stu.*** = "male"

以前在objective-c中,我們例項化乙個類時,一般會明確呼叫alloc和init方法。比如說,建立乙個uiview物件:

uiview *view = [[uiview alloc] init];
但是,在swift中,如果要建立乙個uiview物件,好像不用呼叫任何方法,直接使用型別加小括號就可以了:

let view = uiview()
實際上,在swift中建立乙個物件,仍然需要呼叫方法,而小括號就代表著方法的呼叫。在上面的**中,我們實際上呼叫了系統預設的init()方法。以上面的person類為例,它實際上應該是類似於下面這樣的:

class person 

}struct student

}

2、建構函式與儲存屬性的初始化

我們都知道,儲存屬性在定義的時候需要初始化,否則編譯器會報錯。但是實際上,除了可以在定義的時候初始化之外,還可以在建構函式中對其進行初始化:

class person 

}struct student

}// 在例項化的過程中,通過建構函式對它的屬性進行初始化

let p = person(age: 20, name: "lebron")

p.stu.no = 1701

p.stu.*** = "femal"

以上面的person類為例,其屬性age和name在定義的時候沒有被初始化,但是在例項化的時候,我們通過建構函式分別給它們初始化為20和lebron。建構函式只能初始化儲存屬性(不管常量還是變數都可以),不能初始化計算屬性(因為計算屬性不需要儲存資料)和靜態屬性(因為靜態屬性跟具體的例項無關)。

3、建構函式過載

在了解什麼是建構函式過載之前,我們先來了解一下什麼叫做函式過載。函式過載就是指函式名(或者沿襲objective-c中叫方法也行)相同,但是引數不同。引數不同又包括引數標籤不同、引數個數不同和引數型別不同。objective-c中沒有方法過載的概念,因為在objective-c中呼叫方法的本質是傳送訊息,如果方法名相同,系統在傳送訊息時,就不知道該把訊息傳送給誰。建構函式過載,就是指同乙個類或者結構體中可以有多個init()函式,但是它們的引數不同。比如說:

// 類的建構函式

class person

// 建構函式2

init(age: int, name: string)

// 建構函式3

init(a age: int, n name: string)

}// 呼叫建構函式1

let p1 = person()

p1.age = 33

p1.name = "james"

print("age = \(p1.age), name = \(p1.name)") // age = 33, name = james

// 呼叫建構函式2

let p2 = person(age: 33, name: "anthony")

print("age = \(p2.age), name = \(p2.name)") // age = 33, name = anthony

// 呼叫建構函式3

let p3 = person(a: 35, n: "wade")

print("age = \(p3.age), name = \(p3.name)") // age = 35, name = wade

上面的person類中定義了3個建構函式,它們之間是過載的關係,在例項化的過程中,通過呼叫不同的建構函式來建立物件。

4、建構函式**

有時候為了減少**重複,在定義建構函式時,可以在乙個建構函式中呼叫另外乙個建構函式,這種情況被稱之為建構函式**。比如說:

class person 

// 建構函式2

init(age: int, name: string)

// 建構函式3

init(a age: int, n name: string)

}

在上面的**中,我們在建構函式1中呼叫了建構函式2,這種情況就是建構函式**。在結構體中,構造函式呼叫其它建構函式時,可以直接呼叫,前面不用加關鍵字convenience。但是,由於類具有繼承關係,類裡面的建構函式**又相對複雜一點。

如果建構函式**是發生在同乙個類的內部,那麼這種建構函式便稱之為便利建構函式,比如說像上面那種情況就是便利建構函式;如果建構函式**是發生在子類中,那麼子類在構造過程中需要呼叫父類的建構函式,初始化父類的儲存屬性,這種建構函式稱之為指定建構函式。比如說:

class person 

init(age: int, name: string)

}class student: person

// 便利建構函式

convenience override init(age: int, name: string)

}// 例項化student

let stu = student(age: 20, name: "anthony", no: 1701, height: 1.72)

子類中建構函式的**涉及到了繼承,所以相關**的解釋我準備放在繼承中進行。

5、析構函式

析構過程與構造過程相反,析構在例項釋放的時候需要清除一些資源。析構過程會呼叫deinit函式。deinit函式又被稱為析構函式,它沒有返回值,沒有引數,也不需要小括號。析構函式不能過載。析構函式的具體例項如下:

// 類的建構函式

class person

convenience init(a age: int, n name: string)

deinit

}var p: person? = person(age: 20, name: "james")

print("age = \(p!.age), name = \(p!.name)")

// 呼叫析構函式,釋放資源

p = nil

析構函式的呼叫使得例項被賦值為nil,表示例項需要釋放資源。p = nil是觸發析構函式呼叫的條件。

Swift中的構造方法

注意 swift對類的構造方法有乙個基本的要求,那就是當構造完乙個物件之後,物件中所有的儲存屬性都要被初始化。對構造方法的理解 構造方法的作用是對物件進行初始化,也就是給物件所占用的記憶體進行初始化。但是只有儲存屬性才會真正地佔據記憶體。所以,構造方法的最主要目的是將所有的儲存屬性設定初始值。即乙個...

swift構造方法

class human 預設構造 init name string 結構體逐一成員構造方法是結構體特有的,類是沒有這個構造方法的。struct size 列舉型別的構造方法.列舉是不能通過型別來隱式呼叫構造方法的,只有給列舉定義了構造方法,才可以讓列舉像類或者結構體那樣構造物件。enum color...

關於swift構造方法

switf 中如果遇到這樣的錯,大概錯誤就是,必須要呼叫父類的構造方法 可是呢,呼叫了super.init 不就是呼叫了構造方法了嗎?結果上去一查,結果一名外國大神 therefore what you ll do is callinit nibname bundle and since this ...