Swift中文教程(五)對象和類

來源:互聯網
上載者:User

Class 類

在Swift中可以用class關鍵字後跟類名建立一個類。在類裡,一個屬性的聲明寫法同一個常量或變數的聲明寫法一樣,除非這個屬性是在類的上下文裡面,否則,方法和函數的寫法也是這樣:

class Shape {      var numberOfSides = 0      func simpleDescription() -> String {          return "A shape with \(numberOfSides) sides."    }  }

練習:

用let關鍵字添加一個常量屬性,添加另一個方法用來接收參數。

在類名後面加小括弧來建立類的執行個體化,使用.(點號串連符)來訪問執行個體的方法和屬性:

1 var shape = Shape()
2 shape.numberOfSides = 7
3 var shapeDescription = shape.simpleDescription()

這個版本的Shape類缺少一個重要的東西:構造器--類被建立後的設定。可以使用init來建立一個:

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是用來區分構造器內的name參數和name屬性的。建立類的執行個體時,構造器裡的參數傳遞和函數的參數傳遞形式是一樣的。每個屬性都需要為其指定一個值,無論是在聲明中(如nameOfSides),或是在構造器內(如name)。

使用 deinit 來建立一個析構器,來執行對象銷毀時的清理工作。

繼承和多態

子類可以加冒號後直接跟超類名,子類聲明時並不需要非得制定任何標準基類,所以子類後的超類可以被忽略。

子類的方法覆蓋或重載超類中的實現要加上override標記,否則,編譯器會報錯,編譯器也會檢測被標記為override的重載方法到底有沒有覆蓋到超類。

class Square: NamedShape {//接上一例,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 {//在此處用override重載了上一例中超類NameSpace的方法simpleDescription  // 查看本欄目更多精彩內容:http://www.bianceng.cn/Programming/extra/        return "A square with sides of length \(sideLength)."    }  }  let test = Square(sideLength: 5.2, name: "my test square")  test.area()  test.simpleDescription()

練習:

編寫另一個NamedShape的子類:Circle ,傳入半徑和名字作為參數到其構造器,並在Circle類中實現area和describe方法。

此外,聲明過的屬性通常還有一個get和一個set方法:

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")  triangle.perimeter  triangle.perimeter = 9.9  triangle.sideLength

上例中,perimeter的set中值的預設名是newValue,你可以再set後面以小括弧的方式為其指定其它的名字。

請注意, EquilateralTriangle類的構造器有三個不同的步驟:

第一步,設定子類各個屬性的值;

第二步,調用超類的構造器;

第三步,改變超類中定義的屬性的值,其它的方法,get,set等都可以在此一步驟實行。

如果你不需要計算屬性的值,但是想在設定屬性值之前或之後執行代碼,那麼你可以使用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")  triangleAndSquare.square.sideLength  triangleAndSquare.triangle.sideLength  triangleAndSquare.square = Square(sideLength: 50, name: "larger square")  triangleAndSquare.triangle.sideLength

類的方法與函數有一個重要的區別:函數的參數名僅作用於此函數內,而方法的參數名可以用於調用方法(第一個參數除外)。預設時,一個方法有一個同名的參數,調用時就是方法本身。你可以指定第二個名字,在方法內部使用:

class Counter {      var count: Int = 0      func incrementBy(amount: Int, numberOfTimes times: Int) {          count += amount * times      }  }  var counter = Counter()  counter.incrementBy(2, numberOfTimes: 7)

當與可選值(詳見第三章的If語句介紹)一起工作時,你可以在方法或屬性前寫 "?" 操作符。如果值在"?"之前就已經是 nil ,所有在 "?" 之後的都會自動忽略,而整個運算式是 nil 。另外,可選值是未封裝的,所有 "?" 之後的都作為未封裝的值。在這兩種情況中,整個運算式的值是可選值:

1 let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")//?可選值的介紹詳見第三章的If語句部分
2 let sideLength = optionalSquare?.sideLength

作者:cnblogs Joe.Huang

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.