Swift-對(duì)象和類(lèi)

類(lèi)

使用class后跟類(lèi)的名稱(chēng)來(lái)創(chuàng)建類(lèi)厌小。 類(lèi)中的屬性聲明的寫(xiě)法與常量或變量聲明相同筛欢。 同樣浸锨,方法和函數(shù)聲明的寫(xiě)法也是一樣的。

class Shape {
    var numberOfSides = 0  //屬性
    func simpleDescription() -> String {//無(wú)參數(shù)有返回值得方法
        return "A shape with \(numberOfSides) sides."
    }
}

通過(guò)在類(lèi)名稱(chēng)后面添加括號(hào)來(lái)創(chuàng)建類(lèi)的實(shí)例版姑。 使用點(diǎn)語(yǔ)法訪問(wèn)實(shí)例的屬性和方法柱搜。

var shape = Shape() //實(shí)例化了一個(gè)Shape的對(duì)象
shape.numberOfSides = 7 //使用點(diǎn)語(yǔ)法訪問(wèn)類(lèi)的屬性
var shapeDescription = shape.simpleDescription()//使用點(diǎn)語(yǔ)法調(diào)用類(lèi)的方法

如果我們想要在初始化的時(shí)候給類(lèi)的屬性賦值或者調(diào)用方法,那我們需要自己用init來(lái)創(chuàng)建初始化方法

class NamedShape {
    var numberOfSides: Int = 0
    var name: String

    init(name: String){
       self.name = name
    }

    func simpleDescription() -> String {
       return "A shape with \(numberOfSides) sides."
    }
    deinit {
        print("對(duì)象要被釋放了剥险,在這里做一些處理")
    }
}
  • 注意:如何使用self來(lái)區(qū)分name屬性和name參數(shù)在初始化方法中聪蘸。 初始化方法的參數(shù)在創(chuàng)建類(lèi)的實(shí)例時(shí)像一個(gè)函數(shù)調(diào)用一樣傳遞。 每個(gè)屬性都需要一個(gè)賦值的值表制,無(wú)論是在聲明中(如numberOfSides)還是在初始化方法中(和name一樣)健爬。
  • 如果需要在釋放對(duì)象之前執(zhí)行一些清理,請(qǐng)使用deinit創(chuàng)建一個(gè)deinitializer夫凸。
  • 子類(lèi)在類(lèi)名之后包括它們的父類(lèi)名,用冒號(hào)分隔阱持。 任何根類(lèi)不需要類(lèi)來(lái)子類(lèi)化夭拌,因此您可以根據(jù)需要包括或省略父類(lèi)類(lèi)。
  • override關(guān)鍵字,標(biāo)志著這個(gè)方法是從父類(lèi)繼承過(guò)來(lái)的鸽扁,子類(lèi)重寫(xiě)了蒜绽,父類(lèi)的方法,但是他并沒(méi)有取代父類(lèi)中的方法桶现。
class Square: NamedShape {
    var sideLength: Double

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name) //調(diào)用父類(lèi)的初始化方法去初始化name
        numberOfSides = 4
    }

    func area() ->  Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {//重寫(xiě)了父類(lèi)的方法
        return "A square with sides of length \(sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

屬性的getter和setter

除了存儲(chǔ)的簡(jiǎn)單屬性之外躲雅,屬性還可以有一個(gè)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 triangle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)/調(diào)用get方法
triangle.perimeter = 9.9//調(diào)用set方法
print(triangle.sideLength)

在swift中骡和,系統(tǒng)會(huì)自動(dòng)給我們生成一個(gè)隱式的變量名叫“newValue”相赁,我們也可以自己聲明一個(gè)顯示的變量名

    var perimeter: Double {
        get {
             return 3.0 * sideLength
        }
        set (perimeter){//顯示的名稱(chēng)
            sideLength = perimeter / 3.0
        }
    }

注意 EquilateralTriangle類(lèi)的初始化有三個(gè)不同的步驟:

  • 設(shè)置子類(lèi)聲明的屬性的值。
  • 調(diào)用父類(lèi)的初始化方法慰于。
  • 更改由父類(lèi)定義的屬性的值钮科。 使用方法,getter或setter的任何額外的設(shè)置工作也可以在這一點(diǎn)上完成婆赠。

willSet绵脯、didSet

如果不需要計(jì)算屬性,但仍需要提供在設(shè)置新值之前和之后運(yùn)行的代碼休里,請(qǐng)使用willSet和didSet蛆挫。 您提供的代碼在值在初始值之外更改時(shí)運(yùn)行。 例如妙黍,下面的類(lèi)確保其三角形的邊長(zhǎng)總是與其正方形的邊長(zhǎng)相同悴侵。

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)

可選值

使用可選值時(shí),在“废境?” 之前的操作畜挨,如方法,屬性和下標(biāo)噩凹。 如果“巴元?”之前的值是nil,那么“驮宴?”之后的將會(huì)被忽略逮刨,整個(gè)表達(dá)式的值為nil。 否則堵泽,可選值被展開(kāi)修己,并且之后的所有內(nèi)作用于展開(kāi)的值。 在這兩種情況下迎罗,整個(gè)表達(dá)式的值都是可選值睬愤。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纹安,隨后出現(xiàn)的幾起案子尤辱,更是在濱河造成了極大的恐慌砂豌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件光督,死亡現(xiàn)場(chǎng)離奇詭異阳距,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)结借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)筐摘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人船老,你說(shuō)我怎么就攤上這事咖熟。” “怎么了努隙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵球恤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荸镊,道長(zhǎng)咽斧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任躬存,我火速辦了婚禮张惹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岭洲。我一直安慰自己宛逗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盾剩。 她就那樣靜靜地躺著雷激,像睡著了一般。 火紅的嫁衣襯著肌膚如雪告私。 梳的紋絲不亂的頭發(fā)上屎暇,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音驻粟,去河邊找鬼根悼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜀撑,可吹牛的內(nèi)容都是我干的挤巡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酷麦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矿卑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沃饶,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤母廷,失蹤者是張志新(化名)和其女友劉穎瀑晒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體徘意,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年轩褐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椎咧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡把介,死狀恐怖勤讽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拗踢,我是刑警寧澤脚牍,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站巢墅,受9級(jí)特大地震影響诸狭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜君纫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一驯遇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓄髓,春花似錦叉庐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肢执,卻和暖如春枉阵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔚万。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工岭妖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人反璃。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓昵慌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親淮蜈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斋攀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • Swift 中使用class 后加類(lèi)名來(lái)創(chuàng)建一個(gè)類(lèi). 類(lèi)中的屬性聲明, 方法和函數(shù)聲明與普通的常量,變量,函數(shù)的聲...
    大刀和長(zhǎng)劍閱讀 477評(píng)論 0 1
  • 使用 'class' 關(guān)鍵字后跟類(lèi)名來(lái)創(chuàng)建一個(gè)類(lèi)。在一個(gè)類(lèi)中梧田,申明一個(gè)屬性的寫(xiě)法淳蔼,同申明一個(gè)常量或變量的寫(xiě)法是一樣...
    RX78178閱讀 560評(píng)論 0 0
  • 使用class后面跟隨類(lèi)的名字侧蘸,來(lái)創(chuàng)建一個(gè)類(lèi)。屬性的寫(xiě)法同變量和常量的寫(xiě)法是一樣的鹉梨,只不過(guò)上下文是類(lèi)讳癌。方法和函數(shù)同...
    HunterDude閱讀 825評(píng)論 0 0
  • 123.繼承 一個(gè)類(lèi)可以從另外一個(gè)類(lèi)繼承方法,屬性和其他特征。當(dāng)一個(gè)類(lèi)繼承另外一個(gè)類(lèi)時(shí), 繼承類(lèi)叫子類(lèi), 被繼承的...
    無(wú)灃閱讀 1,392評(píng)論 2 4
  • 官方文檔 初始化 Initialization是為準(zhǔn)備使用類(lèi)存皂,結(jié)構(gòu)體或者枚舉實(shí)例的一個(gè)過(guò)程晌坤。這個(gè)過(guò)程涉及了在實(shí)例里...
    hrscy閱讀 1,136評(píng)論 0 1