swift基礎(chǔ)—對象和類(Objects and Classes)

使用“class”和類名來創(chuàng)建一個類悯辙。類中屬性的聲明和常量迎吵、變量聲明一樣击费,唯一的區(qū)別就是它們的上下文是類。同樣蔫巩,方法和函數(shù)聲明也一樣。

class Shape {

? var numberOfSides = 0

? func simpleDescription() -> String {

? ? return "A shape with \(numberOfSides) sides."

? }

}

要創(chuàng)建一個類的實例垃瞧,在類名后面加上括號坪郭。使用點語法來訪問實例的屬性和方法。

var shape = Shape()

shape.numberOfSides = 7

var shapeDescription = shape.simpleDescription()

這個版本的Shape類缺少了一些重要的東西:一個構(gòu)造函數(shù)來初始化類實例嗦锐。使用“init”來創(chuàng)建一個構(gòu)造器沪曙。

class NamedShape {

? var numberOfSides: Int = 0

? var name: String

? init(name: String) {

? ? self.name = name

? }

? func simpleDescription() -> String {

? ? return "A shape with \(numberOfSides) sides."

? }

}

注意“self”被用來區(qū)別實例變量。當(dāng)你創(chuàng)建實例的時候菊值,像傳入函數(shù)參數(shù)一樣給類傳入構(gòu)造器的參數(shù)育灸。每個屬性都需要賦值——無論是通過聲明(就像“numberOfSides”)還是通過構(gòu)造器(就像“name”)。

如果你需要在刪除對象之前進(jìn)行一些清理工作儿子,使用“deinit”創(chuàng)建一個析構(gòu)函數(shù)砸喻。

子類的定義方法是在它們的類名后面加上父類的名字蒋譬,用冒號分割愉适。創(chuàng)建類的時候并不需要一個標(biāo)準(zhǔn)的根類维咸,所以你可以忽略父類。

子類如果要重寫父類的方法的話癌蓖,需要用“override”標(biāo)記——如果沒有添加“override”就重寫父類方法的話編譯器會報錯。編譯器同樣會檢測“override”標(biāo)記的方法是否確實在父類中坐慰。

class Square: NamedShape {

? var sideLength: Double

? init(sideLength: Double, name: String) {

? ? self.sideLength = sideLength

? ? super.init(name: name)

? ? numberOfSides = 4

? }

? func area() ->? Double {

? ? return sideLength * sideLength

? }

? override func simpleDescription() -> String {

? ? return "A square with sides of length \(sideLength)."

? }

}

let test = Square(sideLength: 5.2, name: "my test square")

test.area()

test.simpleDescription()

除了儲存簡單的屬性之外结胀,屬性可以有“getter”和“setter”永毅。

class EquilateralTriangle: NamedShape {

? var sideLength: Double = 0.0

? init(sideLength: Double, name: String) {

? ? self.sideLength = sideLength

? ? super.init(name: name)

? ? numberOfSides = 3

? }

? var perimeter: Double {

? ? get {

? ? ? return 3.0 * sideLength

? ? }

? ? set {

? ? ? sideLength = newValue / 3.0

? ? }

? }

? override func simpleDescription() -> String {

? ? return "An equilateral triagle with sides of length \(sideLength)."

? }

}

var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")

print(triangle.perimeter)

triangle.perimeter = 9.9

print(triangle.sideLength)

在“perimeter”的“setter”中人弓,新值的名字是“newValue”崔赌。你可以在“set”之后顯式的設(shè)置一個名字。

注意“EquilateralTriangle”類的構(gòu)造器執(zhí)行了三步:

1. 設(shè)置子類聲明的屬性值

2. 調(diào)用父類的構(gòu)造器

3. 改變父類定義的屬性值健芭。其他的工作比如調(diào)用方法、getters 和 setters 也可以在這個階段完成若贮。

如果你不需要計算屬性痒留,但是仍然需要在設(shè)置一個新值之前或者之后運行代碼,使用“willSet”和“didSet”匾效。

比如恤磷,下面的類確保三角形的邊長總是和正方形的邊長相同野宜。

class TriangleAndSquare {

? var triangle: EquilateralTriangle {

? ? willSet {

? ? ? square.sideLength = newValue.sideLength

? ? }

? }

? var square: Square {

? ? willSet {

? ? triangle.sideLength = newValue.sideLength

? ? }

? }

? init(size: Double, name: String) {

? ? square = Square(sideLength: size, name: name)

? ? triangle = EquilateralTriangle(sideLength: size, name: name)

? }

}

var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")

print(triangleAndSquare.square.sideLength)

print(triangleAndSquare.triangle.sideLength)

triangleAndSquare.square = Square(sideLength: 50, name: "larger square")

print(triangleAndSquare.triangle.sideLength)

處理變量的可選值時匈子,你可以在操作(比如方法闯袒、屬性和子腳本)之前加“?”。如果“?”之前的值是“nil”原茅,“?”后面的東西都會被忽略堕仔,并且整個表達(dá)式返回“nil”。否則摩骨,“?”之后的東西都會被運行恼五。在這兩種情況下,整個表達(dá)式的值也是一個可選值灾馒。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")

let sideLength = optionalSquare?.sideLength

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睬罗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子古涧,更是在濱河造成了極大的恐慌花盐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒昏,死亡現(xiàn)場離奇詭異也祠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堪旧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門淳梦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爆袍,你說我怎么就攤上這事∠掖” “怎么了蜘醋?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啸罢。 經(jīng)常有香客問我胎食,道長,這世上最難降的妖魔是什么衩匣? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任酣倾,我火速辦了婚禮躁锡,結(jié)果婚禮上置侍,老公的妹妹穿的比我還像新娘。我一直安慰自己蜡坊,他們只是感情好杠输,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秕衙,像睡著了一般蠢甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上据忘,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天鹦牛,我揣著相機(jī)與錄音搞糕,去河邊找鬼。 笑死曼追,一個胖子當(dāng)著我的面吹牛窍仰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼殊,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晶伦!你這毒婦竟也來了碟狞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤婚陪,失蹤者是張志新(化名)和其女友劉穎篷就,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近忙,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡竭业,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了及舍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未辆。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锯玛,靈堂內(nèi)的尸體忽然破棺而出咐柜,到底是詐尸還是另有隱情,我是刑警寧澤攘残,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布拙友,位于F島的核電站,受9級特大地震影響歼郭,放射性物質(zhì)發(fā)生泄漏遗契。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一病曾、第九天 我趴在偏房一處隱蔽的房頂上張望牍蜂。 院中可真熱鬧,春花似錦泰涂、人聲如沸蔬浙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至途凫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工赁还, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驹沿。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓艘策,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渊季。 傳聞我的和親對象是個殘疾皇子朋蔫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 2014年的蘋果全球開發(fā)者大會(WWDC),當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,289評論 0 9
  • Classes and Objects github:Swift基礎(chǔ)實例github:SwiftBasicTabl...
    廚子閱讀 356評論 0 2
  • swift是一門什么語言了却汉? swift語言是蘋果2014年6月3日正式推出一門新的的語言驯妄。swift語言主...
    在倫敦涂鴉閱讀 375評論 0 2
  • /* 對象和類 */ //注意 self 被用來區(qū)別實例變量。當(dāng)你創(chuàng)建實例的時候,像傳入函數(shù)參數(shù)一樣給類傳入構(gòu)造器...
    cz3w閱讀 832評論 0 0
  • your eyes like holes,I would never escaped.
    孔蒼煢閱讀 177評論 0 0