Swift 建構函式 一

2021-07-14 21:37:36 字數 1831 閱讀 7060

------ 知之部落格 期待與您交流! -------

- 建構函式

建構函式

:建構函式是一種特殊的函式,主要用來在建立物件時初始化物件,為物件成員變數設定初始值。

swift中是支援函式過載的,所有的建構函式命都是init,雖然oc是不支援過載的,但是oc支援建構函式,oc中的建構函式是initwith***。

建構函式的作用:分配空間、設定初始值。

二 建構函式的過載

建立乙個swift專案,然後建立乙個person類,在person類中宣告屬性。

import uikit

class person: nsobject

然後command+b編譯一下會報錯(錯誤資訊:class 'person' has no initializers),錯誤的原因是因為swift中的屬性分為可選屬性和必選屬性,如果我們沒有加『?』進行修飾,那麼他就是乙個必選屬性,所謂的必選屬性就要在初始化方法裡面去給他分配空間和設定初始值。

由於nsobject中雖然有init()這個方法,但是系統裡面並沒有我們宣告的這些屬性,子類有需要執行自己的邏輯,所以結合oc的思路我們很容易想到繼承之後進行方法的重寫。(swift中重寫用override進行修飾)

import uikit

class person: nsobject

}

在這裡一定要注意先初始化子類的必選屬性,然後在初始化父類,否則系統會報錯(錯誤資訊:property 『self.name』 not initialized at super.init call),其實還是去系統查詢屬性去了,但是系統根本沒有我們自定義的屬性。所以要先初始化子類的必選屬性,然後在初始化父類。

在控制器中初始化person物件,然後列印name、age的值,如下:

import uikit

class viewcontroller: uiviewcontroller

override func didreceivememorywarning()

}

但是這樣執行的結果是一定的,那如何根據我們的設定來改變name、age的值呢?這就引入了建構函式的過載概念,可以根據需求初始化出乙個我們需要的物件出來。需要注意的是建構函式不能用override進行修飾,因為系統本身是沒有這個方法的。

import uikit

class person: nsobject

}

在控制器初始化person物件,就只能呼叫我們過載的建構函式了,

因為如果過載了建構函式,並沒有重寫預設的建構函式,系統預設建構函式就不再提供了,預設的init()無法完成分配空間和設定初始值的工作,所以也就不能使用了,當person再去呼叫init()的時候就會報錯。

import uikit

class viewcontroller: uiviewcontroller

override func didreceivememorywarning()

}

輸出結果就是:老王 22.

三 小結

非 optional 屬性,都必須在建構函式中設定初始值,從而保證物件在被例項化的時候,屬性都被正確初始化;

在呼叫父類建構函式之前,必須保證本類的屬性都已經完成初始化;

swift 中的建構函式不用寫func。

《swift-建構函式(二)》將介紹子類的建構函式。

Swift 3 建構函式 過載建構函式

viewcontroller.swift import uikit class viewcontroller uiviewcontroller person.swift 建構函式 分配記憶體空間 設定初始值 在swift中 所有的構造方法 都是init 建構函式的責任就是 一定構造乙個物件出來 過載...

Swift 4 建構函式 KVC構造

viewcontroller.swift import uikit 在swift中 所有的類和類的方法 都是共享的 在同乙個命名空間 所有的類都是共享的 命名空間 是專案名稱 class viewcontroller uiviewcontroller person.swift 建構函式 分配記憶體空...

Swift基礎篇 建構函式

import foundation swift中要求在建立乙個類時必須給這個類中所有的屬性進行初始化 如果不能在建立物件時給這個類中所有的屬性進行初始化,那麼這些屬性必須是可選的 如果已經在構造方法中對所有的屬性進行了初始化,那麼這些屬性就可以不是可選型別 在給某乙個類指定屬性的資料型別時,如果該屬...