Swift 的類、結構體、枚舉構造完成後它們的所有存儲屬性一定有一個值
存儲屬性可以在聲明的時候直接給定一個默認值或者在構造的時候賦值,可選屬性在初始化的時候會被賦值nil
構造器的語法
自定義外部參數名稱
struct Counter {
let max : Int
var min = 9
var current:Int?
//自定義外部名稱
init(maxValue a : Int,minValue b:Int) {
max = a
if b < 0 {
min = b
}
}
}
我們定義一個結構體Counter,並提供一個構造器
init(maxValue a : Int,minValue b:Int)
類似於函數這個構造器我們可以指定外部參數名稱(maxValue,minValue)用於區分不同的構造器。對於存儲屬性我們既可以在聲明的時候給定默認值也可以在構造的過程中重新設置,如在上面的構造過程中只有當b<0時纔對min賦值。對於常量屬性我們可以在構造的過程中賦值(沒有默認值的情況)
對於可選屬性如果我們在構造的過程中沒有給它賦值,它將自動獲得一個值nil
上面的構造器可以這樣調用:var a = Counter(maxValue: 100, minValue:0)
默認外部參數名稱
struct Counter {
let max:Int
var min = 9
var current:Int?
//自定義外部名稱
init(maxValue a : Int,minValue b:Int) {
max = a
if b < 0 {
min = b
}
}
//默認外部參數名稱
init(max:Int) {
self.max = max
min = 0
}
}
構造器
init(max:Int)
我們並沒有顯示聲明函數外部名稱它將自動獲得一個與內部名稱一樣的外部名稱在構造器裏面我們可以使用屬性名直接引用屬性,但是如果構造器的內部參數名稱與屬性名重名可以使用self.propertyName這個格式來引用屬性
上面的構造器可以這樣調用:var b = Counter(max: 50)
忽略外部參數名稱
struct Counter {
let max:Int
var min = 9
var current:Int?
//自定義外部名稱
init(maxValue a : Int,minValue b:Int) {
max = a
if b < 0 {
min = b
}
}
//默認外部參數名稱
init(max:Int) {
self.max = max
min = 0
}
//忽略外部參數名稱
init(_ a:Int,_ b:Int) {
//值類型的構造器代理(枚舉和結構體)
if a > b {
self.init(maxValue: a, minValue: b)
}else {
self.init(maxValue: b, minValue: a)
}
}
}
如果我們不想使用外部參數名稱可以用_表示忽略
對於值類型來說在一個構造器中可以直接代理它本身的其他構造器來完成一部分構造過程
上面的構造器可以這樣調用:var c = Counter(20,100)
默認構造器
如果結構體和類所有的屬性都有默認值它們將自動獲得一個默認構造器
class Person {
var givenName = "仙貝"
var lastName = "落霞"
var age:Int?
}
對於類(也可以是結構體)來說,如果它的所有屬性都有存在一個默認值它將自動獲得一個默認構造器,你可以使用默認構造器來初始化這個類:var f = Person()
結構體的逐一成員構造器
struct Color {
//如果結構體或者類所有的屬性都都有默認值,它將自動獲得一個默認構造器
//如果結構體沒有自定義構造器它將自動獲得逐一成員構造器(常量屬性除外)
var r = 124
let g = 255
var b:Int?
}
如果結構體沒有自定義構造器它將獲得一個逐一成員構造器,對於上面的結構體Color你可以通過兩種方法初始化:
通過默認構造器
var d = Color()
通過結構體逐一成員構造器
var e = Color(r: 255, b: 244)
END
下一篇Swift 構造過程2 我們將說說類的構造