swift學習筆記之構造方法和析構方法

2021-07-12 04:52:31 字數 4494 閱讀 5796

//swift的構造器(initilizer)和析構器(deinitializer)

//構造器並不像函式和方法那樣在括號前有乙個可辨別的名字。所以在呼叫構造器時,主要通過構造器中的引數名和型別來確定需要呼叫的構造器。 正因為引數如此重要,如果你在定義構造器時沒有提供引數的外部名字,swift 會為每個構造器的引數自動生成乙個跟內部名字相同的外部名,就相當於在每個構造引數之前加了乙個雜湊符號。

import foundation

//預設構造器 init()

struct fahrenheit

}var f = fahrenheit() //呼叫預設構造器,沒有引數,沒有返回值

print("the default temperature=\(f.temperature)")

//逐一成員構造器---只針對結構體..類沒有該構造器

//如果結構體對所有儲存型屬性提供了預設值且自身沒有提供定製的構造器,它們能自動獲得乙個逐一成員構造器。

struct size

let twobytwo = size(width: 2.0, height: 2.0)

struct point

//swift 將為所有屬性已提供預設值的且自身沒有定義任何構造器的結構體或基類,提供乙個預設的構造器

class shoppinglistitem

var item = shoppinglistitem()//預設構造器

//自定義構造器 init(fromfahrenheit:) 和init(fromkelvin:)

struct celsius

init(fromkelvin kelvin: double)

}let boilingpointofwater = celsius(fromfahrenheit:212.0)

// boilingpointofwater.temperatureincelsius is 100.0

let freezingpointofwater = celsius(fromkelvin:273.15)

// freezingpointofwater.temperatureincelsius is 0.0

//只要在構造過程結束前常量的值能確定,你可以在構造過程中的任意時間點修改常量屬性的值。 對某個類例項來說,它的常量屬性只能在定義它的類的構造過程中修改;不能在子類中修改。

class surveyquestion

func ask()

}var a = surveyquestion(text: "dddd")

a.ask();

//如果定義的型別包含乙個可以為空的儲存型屬性,需要將其定義為可選型別 (optional type), 則自動初始化為nil,表示這個屬性是故意初始化設定為空的

class surveyquestion1

func ask()

}let cheesequestion = surveyquestion(text: "do you like cheese?")

cheesequestion.ask()

// prints "do you like cheese?"

cheesequestion.response = "yes, i do like cheese."

//構造器**

//構造器可以通過呼叫其它構造器來完成例項的部分構造過程。這一過程稱為構造器**,它能減少多個構造器間的**重複。 就是巢狀構造器方法 對於值型別,你可以使用self.init在自定義的構造器中引用其它的屬於相同值型別的構造器。並且你只能在構造器內部呼叫self.init。

struct rect

init(origin: point, size: size)

init(center: point, size: size)

}//5.類的繼承和構造過程

//類裡所有的儲存型別屬性包括繼承父類的屬性都需要在構造過程中設定初始值,swift提供兩種型別的類構造器來確保所有類例項中的儲存屬性都能獲得初始值

//指定構造器和便利構造器

//指定構造器是類中最主要的構造器,將初始化類中所提供的所有屬性,每個類至少需要乙個指定構造器,便利構造器是輔助型的構造器,可呼叫同一類中的指定構造器,並為其引數提供預設值

//構造器鏈

//swift採用三條規則來限制構造器之間的**呼叫

//a.指定構造器必須呼叫其直接父類的指定構造器

//b.便利構造器必須呼叫同一類中定義的其他構造器

//c.便利構造器最終必須呼叫乙個指定構造器結束

//(指定構造器總是向上**,便利構造器總是橫向**)

//構造器的繼承和過載

//swift中的子類預設不會繼承父類的構造器,防止父類的簡單構造被子類繼承,並錯誤的建立子類的例項,如果希望子類能繼承父類相同的構造器,需要定製子類的構造器

//指定構造器和便利構造器的語法

//init(parameters)

便利構造器前置 convenience關鍵字

//convenience init(parameters)

class food

convenience init()

}let namedmeat = food(name: "bacon")

// namedmeat's name is "bacon"

let mysterymeat = food()

// mysterymeat's name is "[unnamed]"

class recipeingredient: food

convenience override init(name: string)

}let onemysteryitem = recipeingredient()

let onebacon = recipeingredient(name: "bacon")

let sixeggs = recipeingredient(name: "eggs", quantity: 6)

class shpinglistitem: recipeingredient

}var breakfastlist = [

shoppinglistitem(),

shpinglistitem(name: "bacon"),

shpinglistitem(name: "eggs", quantity: 6),

]//breakfastlist[0].name = "orange juice" breakfastlist[0]唯讀

//breakfastlist[0].purchased = true

for item in breakfastlist

// 1 x orange juice ✔

// 1 x bacon ✘

// 6 x eggs ✘

//與方法、屬性和下標不同,在過載構造器時你沒有必要使用關鍵字override。

//如果你過載的構造器是乙個指定構造器,你可以在子類裡過載它的實現,並在自定義版本的構造器中呼叫父類版本的構造器。 如果你過載的構造器是乙個便利構造器,你的過載過程必須通過呼叫同一類中提供的其它指定構造器來實現。

////自動構造器的繼承

////如果子類沒有定義任何指定構造器,它將自動繼承所有父類的指定構造器。

//如果子類提供了所有父類指定構造器的實現--不管是通過規則1繼承過來的,還是通過自定義實現的--它將自動繼承所有父類的便利構造器

//通過閉包和函式來設定屬性的預設值

////這種型別的閉包或函式一般會建立乙個跟屬性型別相同的臨時變數,然後修改它的值以滿足預期的初始狀態,最後將這個臨時變數的值作為屬性的預設值進行返回。 注意閉包結尾的大括號後面接了一對空的小括號。這是用來告訴 swift 需要立刻執行此閉包。如果你忽略了這對括號,相當於是將閉包本身作為值賦值給了屬性,而不是將閉包的返回值賦值給屬性。 如果你使用閉包來初始化屬性的值,請記住在閉包執行時,例項的其它部分都還沒有初始化。這意味著你不能夠在閉包裡訪問其它的屬性,就算這個屬性有預設值也不允許。同樣,你也不能使用隱式的self屬性,或者呼叫其它的例項方法。 每當乙個新的例項建立時,對應的賦值閉包會執行,

struct checkerboard

isblack = !isblack

}return temporaryboard

}()func squareisblackatrow(row: int, column: int) -> bool

}//析構器,析構器和構造器正好相反,在物件釋放的時候呼叫,使用關鍵字deinit

class player

func wincoins(coins: int)

deinit

}var playerone: player? = player(coins: 100)

print("coinsinpurse : \(playerone!.coinsinpurse) coins")

playerone = nil //呼叫deinit

print("playerone has left the game")

Swift學習之構造過程

類和結構體的儲存屬性必須在例項建立時,設定合適的初始值,可以提供預設值,也可以在構造器中提供初始值 1.構造引數 如果構造器的引數使用了外部引數名,必須使用,也可以用 代替,不適用外部引數名 struct celsius init twotemperature two double let onec...

swift構造方法

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

swift學習筆記 五 構造過程

構造過程是為了使用某個類 結構體或列舉型別的例項而進行的準備過程。在構造過程中,對每乙個屬性進行了初始值預設和其它必要的準備和初始化工作。與oc相比,swift的建構函式。不須要返回值。同一時候,在類和結構體的構造過程中,必須對全部的儲存型別屬性,包括繼承自父類的屬性。賦予合適的初始值。儲存型別值不...