Welcome to Swift (蘋果官方Swift文檔初譯與註解四)---19~28頁

來源:互聯網
上載者:User

標籤:des   c   style   class   a   color   

在Swift中,函數實際上是一種特殊的組合體(閉包),你也可以定義匿名的組合體(閉包),將代碼寫在({})中,並使用in 來分隔參數和傳回值.

  numbers.map({

      (number: Int) -> Int in

      let result = 3 * number

      return result

      })

  EXPERIMENT // 練習題

  Rewrite the closure to return zero for all odd numbers. // 重寫編寫一個組合體,傳回值為0;

為了更精確的使用組合體(閉包),你可以有幾種選擇.當類型是明確的時候,比如代理的回呼函數,你可以忽略它的參數的類型,以及傳回值類型.單語句的組合體,隱式的返回它執行語句的值.

  numbers.map({ number in 3 * number })

參數的指定使用數字取代名稱,這個方法對於非常簡短的組合體(閉包)特別適用. 一個組合體(閉包)作為函數的最後參數傳遞值的時候,可以緊跟在()後面.

  sort([1, 5, 3, 12, 2]) { $0 > $1 }

Objects and Classes

/*對象和類*/

在Swift中,使用class關鍵字再加上類名來建立一個類.類中的成員/屬性聲明方法與之前的常量/變數聲明一樣,只是它們必須在類的定義內.同樣,方法和函數也是如此.

  class Shape {

      var numberOfSides = 0

      func simpleDescription() -> String {

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

      }

  }

  EXPERIMENT // 練習題

  Add a constant property with let, and add another method that takes an argument. //使用let添加一個常量屬性,再添加一個帶有參數的方法;

建立類的執行個體是在類名的後面加一個(),訪問執行個體方法和執行個體成員使用點文法.

  var shape = Shape()

  shape.numberOfSides = 7

  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參數的.建立一個類的執行個體時,參數name的傳遞就像函數調用時一樣.每個屬性成員都需要分配一個值無論是在聲明中還是在初始化裡.

使用 deinit 定義一個登出對象的方法,在這個方法裡你可以在對象被銷毀前執行一些清理事情.

子類的寫法是在類名後面使用:再加上父類的名稱.在Swift中,不在要求子類必須有基礎的根類,因此在恰當的時候,你可以根據情況需要添加或者去掉父類.

子類的方法可以覆蓋(重寫)父類中標記的 override的方法,如果覆蓋(重寫)了父類中沒有標記override的方法,編譯器會直接報錯.編譯器也會檢測子類中標記為 override的方法,即使這個方法不是重載自父類.

  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()

  EXPERIMENT // 練習題

  Make another subclass of NamedShape called Circle that takes a radius and a name as arguments to its initializer. Implement an area and a describe method on the Circle class.

             /**設計一個繼承NamedShape類的子類Circle,並初始化它的成員變數radius和name,再給類添加area和describe方法*/

類的另一種簡便存取成員變數的方式是,使用setter和getter.

  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的setter方法有一個隱含的變數 newValue,也可以在set後添加(),在其中明顯的定義這個變數.

注意在 EquilateralTriangle類中 初始化有三個不同的步驟:

  1. 設定子類聲明的成員變數的值;
  2. 調用父類的初始化;
  3. 修改父類定義的成員變數值,以及其他的一些使用getter或者setter再或者執行個體方法來完成的工作.

/*************後續內容,敬請期待***********/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.