我們可以使用類在Swift中定義類型。
類為我們提供了一種將相關(guān)信息和行為組合在一起的方法。
要定義一個(gè)Swift類,使用 class
關(guān)鍵字。
class Person { var name: String = "Name" var age:Int = 0 func profile() -> String { return "I"m \(self.name) and I"m \(self.age) years old." } }
在上面的代碼中,我們定義了一個(gè)名為 Person
的類。
Person
類由一個(gè)人姓名的字符串組成一個(gè)人的年齡的整數(shù)。
這些變量和常量類型稱為屬性。
要使用 Person
實(shí)例,請(qǐng)根據(jù)此定義創(chuàng)建一個(gè)新實(shí)例。
class Person { var name: String = "Name" var age:Int = 0 func profile() -> String { return "I"m \(self.name) and I"m \(self.age) years old." } } var p = Person()
在Swift中,對(duì)象通常是對(duì)結(jié)構(gòu)和類的實(shí)例的引用。
對(duì)于類實(shí)例屬性,您使用點(diǎn)語(yǔ)法。
p.name = "Tom" p.age = 40
在上面的代碼中,我們使用點(diǎn)語(yǔ)法來(lái)更改變量值。
類是引用類型。
使用賦值運(yùn)算符時(shí),只分配對(duì)實(shí)例的引用。
當(dāng)更改類實(shí)例成員時(shí),它們將反映在實(shí)例無(wú)處不在的程序。
struct S { var i = 1 } class C { var i = 1 } var s = S() var c = C() println("s.i = \(s.i)") println("c.i = \(c.i)")
清單32-2中的語(yǔ)句將打印:
s.i = 1 c.i = 1
引用和復(fù)制實(shí)例之間的主要區(qū)別發(fā)生在使用賦值運(yùn)算符 =
來(lái)引用實(shí)例時(shí)。
對(duì)于結(jié)構(gòu),在分配期間將獲取實(shí)例的副本。此副本獨(dú)立于原始實(shí)例操作。更改副本不會(huì)反映在原始實(shí)例中。
將變量分配給類實(shí)例會(huì)對(duì)類實(shí)例成員進(jìn)行更改,原來(lái)的實(shí)例內(nèi)容也會(huì)改變。
struct S { var i = 1 } class C { var i = 1 } var s2 = s var c2 = c s2.i = 2 c2.i = 2 println("s.i = \(s.i)") println("c.i = \(c.i)")
上面的代碼生成以下結(jié)果。
從輸出我們可以看到原始結(jié)構(gòu)成員不會(huì)改變?cè)碱惖膶?shí)例成員的值更改為與值相同 c2
上的 i
屬性。
類相等運(yùn)算符===比較兩個(gè)類實(shí)例。
如果實(shí)例變量都指向同一個(gè)實(shí)例,此運(yùn)算符將返回true。
class Person { var name: String = "Name" var age:Int = 0 func profile() -> String { return "I"m \(self.name) and I"m \(self.age) years old." } } var p1 = Person() p1.name = "A" p1.age = 40 var p2 = Person() p2.name = "B" p2.age = 25 var b1 = p2 === p2 var b2 = p1 === p2
上面的代碼生成以下結(jié)果。
b1是真的,因?yàn)樗鼈兌际窍嗤膶?shí)例,b2為假。
類實(shí)例不等式身份操作符!==
測(cè)試看是否兩個(gè)實(shí)例不指向同一實(shí)例。
var b7 = p1 !== p1 //returns false
更多建議: