国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 20:26:14
字體:
來源:轉載
供稿:網友

  

 

  Class 類

 

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

1 class Shape {2     var numberOfSides = 03     func simpleDescription() -> String {4         return "A shape with /(numberOfSides) sides."5     }6 }

練習:

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

 

  在類名后面加小括號來創建類的實例化,使用.(點號連接符)來訪問實例的方法和屬性:

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

 

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

 1 class NamedShape { 2     var numberOfSides: Int = 0 3     var name: String 4      5     init(name: String) { 6         self.name = name 7     } 8      9     func simpleDescription() -> String {10         return "A shape with /(numberOfSides) sides."11     }12 }

  注意,此處的self是用來區分構造器內的name參數和name屬性的。創建類的實例時,構造器里的參數傳遞和函數的參數傳遞形式是一樣的。每個屬性都需要為其指定一個值,無論是在聲明中(如nameOfSides),或是在構造器內(如name)。

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

 

  繼承和多態

 

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

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

 

 1 class Square: NamedShape {//接上一例,NamedShape為超類 2     var sideLength: Double 3      4     init(sideLength: Double, name: String) { 5         self.sideLength = sideLength 6         super.init(name: name) 7         numberOfSides = 4 8     } 9     10     func area() ->  Double {11         return sideLength * sideLength12     }13     14     override func simpleDescription() -> String {//在此處用override重載了上一例中超類NameSpace的方法simpleDescription15         return "A square with sides of length /(sideLength)."16     }17 }18 let test = Square(sideLength: 5.2, name: "my test square")19 test.area()20 test.simpleDescription()

 

練習:

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

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

 1 class EquilateralTriangle: NamedShape { 2     var sideLength: Double = 0.0 3      4     init(sideLength: Double, name: String) { 5         self.sideLength = sideLength 6         super.init(name: name) 7         numberOfSides = 3 8     } 9     10     var perimeter: Double {11     get {12         return 3.0 * sideLength13     }14     set {15         sideLength = newValue / 3.016     }17     }18     19     override func simpleDescription() -> String {20         return "An equilateral triagle with sides of length /(sideLength)."21     }22 }23 var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")24 triangle.perimeter25 triangle.perimeter = 9.926 triangle.sideLength

  

  上例中,perimeter的set中值的默認名是newValue,你可以再set后面以小括號的方式為其指定其它的名字。

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

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

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

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

  如果你不需要計算屬性的值,但是想在設置屬性值之前或之后執行代碼,那么你可以使用willset(之前)和didset(之后)。如下例中的類--確保三角形的邊長始終與矩形邊長相等:

 1 class TriangleAndSquare { 2     var triangle: EquilateralTriangle { 3     willSet { 4         square.sideLength = newValue.sideLength 5     } 6     } 7     var square: Square { 8     willSet { 9         triangle.sideLength = newValue.sideLength10     }11     }12     init(size: Double, name: String) {13         square = Square(sideLength: size, name: name)14         triangle = EquilateralTriangle(sideLength: size, name: name)15     }16 }17 var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")18 triangleAndSquare.square.sideLength19 triangleAndSquare.triangle.sideLength20 triangleAndSquare.square = Square(sideLength: 50, name: "larger square")21 triangleAndSquare.triangle.sideLength

 

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

1 class Counter {2     var count: Int = 03     func incrementBy(amount: Int, numberOfTimes times: Int) {4         count += amount * times5     }6 }7 var counter = Counter()8 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

 

 

 

 謝謝,Swifter-QQ群:362232993,同好者進~ 

github地址:https://github.com/Joejo/Swift-lesson-for-chinese

 

 

  

 

 

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹寨县| 乌兰县| 乌兰县| 姜堰市| 绥阳县| 阿瓦提县| 湘乡市| 瓦房店市| 来安县| 土默特右旗| 济阳县| 延川县| 安多县| 贵德县| 金昌市| 乌恰县| 易门县| 咸丰县| 镶黄旗| 新源县| 东丰县| 城步| 威信县| 泗阳县| 即墨市| 兴宁市| 将乐县| 石嘴山市| 调兵山市| 牙克石市| 剑阁县| 林西县| 玉林市| 古浪县| 邻水| 民乐县| 万荣县| 郧西县| 武隆县| 谢通门县| 专栏|