1. 結(jié)構(gòu)體
Swift的Structure和類非常相似蒋歌,同樣都有屬性方法函數(shù)等等聋亡。但有幾個關(guān)鍵不同:
- 結(jié)構(gòu)體無繼承。所以自然也沒有類下降之類的東西近零。
- 結(jié)構(gòu)體是值拷貝。當你創(chuàng)建了一個結(jié)構(gòu)體后抄肖,你的變量名的意思就是這個實例久信。而不是這個實例的名字。這和類是不同的漓摩。為了強調(diào)這點裙士。我們看下面的例子:
// Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a // a is copied to b
a.data = 42 // Changes a, not b
println("\(a.data), \(b.data)") // prints "42, -1"
// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x // x is copied to y
x.data = 42 // changes the instance referred to by x (and y)
println("\(x.data), \(y.data)") // prints "42, 42"
上面的例子取自
https://developer.apple.com/swift/blog/?id=10
算是少見的好例子。計算機書和網(wǎng)站上舉例語法的時候管毙,為了說明自己的例子可能在現(xiàn)實世界發(fā)生腿椎,往往會用什么電話號碼本桌硫,計算器,員工紀錄啃炸,算小費之類的愚蠢的例子铆隘。實際上那些例子非常分散讀者的注意力。有時候幾個a,b,c整數(shù)就可以清楚的說明語法的關(guān)鍵所在的問題南用,有的書弄好幾段解釋員工紀錄是怎么回事膀钠。這不是故意害人么。筆者認為一個語言的feature,和這個feature在寫app時候好不好用训枢,有沒有用托修,那是另一回事,應(yīng)該盡全力和語言介紹分開恒界。
- 結(jié)構(gòu)體的變異方法
默認情況下睦刃,結(jié)構(gòu)體的方法不能改變結(jié)構(gòu)體的屬性。但你可以用關(guān)鍵字mutating定義變異方法用來改變結(jié)構(gòu)體的屬性十酣。例如:
struct a {
var kk = 1
mutating func b()
{
kk = 2
}
}
var d = a()
println(d.kk) //輸出1
d.b()
println(d.kk) //變異方法被調(diào)用過了涩拙,所以輸出為2
- 結(jié)構(gòu)體的類型方法和類的相似,但是用static關(guān)鍵字耸采。如下例:
struct a {
static func b()
{
println("結(jié)構(gòu)體的類型方法被調(diào)用")
}
}
a.b() //輸出為:"結(jié)構(gòu)體的類型方法被調(diào)用"
2. 聚合體
聚合體就是一組名字的集合兴泥。然后給這組名字起了個名字。這個集合的名字虾宇,就是一個新的類型搓彻。
想想看, Int不就是所有整數(shù)集合的名字么?
例如:
enum ac {
case 兔
case 狗
case 熊貓
}
var a = ac.兔
switch a
{
case .兔 :
println("兔子")
default:
println()
} //輸出:兔子
聚合體也有類型方法和實例方法嘱朽。定義和用法和結(jié)構(gòu)體類似旭贬。具體細節(jié)讀者可以查手冊,這里不多講搪泳。
- 訪問控制
Swift有三個訪問控制關(guān)鍵字稀轨,訪問范圍從大到小為:
- public 這個關(guān)鍵字所修飾的項,可以在一切地方使用岸军。
- internal 這是默認的訪問狀態(tài)奋刽,這個關(guān)鍵字修飾的項,只能在同模塊內(nèi)使用艰赞。
- private 這個關(guān)鍵字修飾的項佣谐,只能在同一個文件內(nèi)被使用。
訪問控制要注意兩點:
和object c混合編程的時候方妖,細節(jié)很麻煩台谍。要小心注意。
Swift訪問控制的大小匹配要符合常識。例如一個類是private的趁蕊,你不能把這個類的實例用pubilc修飾。但反過來則是可以的仔役。這是因為類比實例在邏輯上更靠前掷伙。一個類如果是private的,你也不能把它的屬性用pubilc修飾又兵。另外如果一個類或者類型的訪問控制是public,其成員屬性方法的默認訪問控制將會是internal任柜。也就是說,你需要給成員屬性方法明確加上pubilc,其成員才能是public沛厨。
委托初始化
結(jié)構(gòu)體都可以委托初始化宙地。也就是說,它們可以有多個init函數(shù)逆皮,其中一個可以去調(diào)用另一個宅粥。這有什么好處呢? 這樣可以在生成實例的時候更加靈活电谣。例如你想有兩種實例生成的辦法秽梅,一種是傳個參數(shù)讓它生成你需要的實例。另一種是不傳參數(shù)剿牺,讓它生成默認的實例企垦。這種用法類似于類的快捷初始化。
例如:
struct a {
init (c: Int){println(c)}
init(){
self.init(c:10)
}
}
var b = a(c:1) //輸出1
b = a() //輸出10
比較下面的類的快捷初始化:
class a {
init (c: Int){println(c)}
convenience init(){
self.init(c:10)
}
}
var b = a(c:1) //輸出1
b = a() //輸出10