使用類后跟類名創(chuàng)建類。類中的屬性聲明與常量或變量聲明的編寫方式相同呀伙,只是它位于類的上下文中你稚。同樣,方法和函數(shù)聲明的編寫方式也是一樣的醒颖。
?? ? class Shape {
?? ? var numberOfSides = 0
?? ? func simpleDescription() -> String {
?? ? return "A shape with \(numberOfSides) sides."
?? ? }
?? ? }
?? ? 注意self是如何將name屬性從name參數(shù)區(qū)分為初始化器的妻怎。初始化器的參數(shù)在創(chuàng)建類的實(shí)例時(shí)像函數(shù)調(diào)用一樣傳遞。每個(gè)屬性都需要一個(gè)指定的值——無論是在聲明(如numberOfSides)中還是在初始化器(如名稱)中泞歉。
?? ? 如果在釋放對(duì)象之前需要執(zhí)行一些清理逼侦,可以使用deinit創(chuàng)建deinitializer。
?? ? 子類在類名之后包含它們的超類名腰耙,用冒號(hào)分隔榛丢。類不需要子類化任何標(biāo)準(zhǔn)的根類,因此可以根據(jù)需要包含或省略超類挺庞。
?? ? 重寫超類實(shí)現(xiàn)的子類上的方法被標(biāo)記為覆蓋方法晰赞,這是意外發(fā)生的,沒有覆蓋,編譯器會(huì)將其檢測(cè)為錯(cuò)誤掖鱼。編譯器還會(huì)檢測(cè)帶有override的方法然走,這些方法實(shí)際上并不覆蓋超類中的任何方法。
?? ? 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()
?? ? 除了存儲(chǔ)的簡(jiǎn)單屬性之外戏挡,屬性還可以有g(shù)etter和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)
?? ? // Prints "9.3"
?? ? triangle.perimeter = 9.9
?? ? print(triangle.sideLength)
?? ? // Prints "3.3000000000000003"
?? ? 設(shè)置子類聲明的屬性值。
?? ? 調(diào)用超類的初始化器增拥。
?? ? 更改父類定義的屬性的值啄巧。此時(shí)還可以完成任何使用方法、getter或setter的額外設(shè)置工作掌栅。
?? ? 如果您不需要計(jì)算屬性秩仆,但是仍然需要提供在設(shè)置新值之前和之后運(yùn)行的代碼,那么使用willSet和didSet猾封。您提供的代碼將在初始化器之外的任何時(shí)候運(yùn)行澄耍。
?? ? 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)
?? ? // Prints "10.0"
?? ? print(triangleAndSquare.triangle.sideLength)
?? ? // Prints "10.0"
?? ? triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
?? ? print(triangleAndSquare.triangle.sideLength)
?? ? // Prints "50.0"