麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-14 20:26:14
字體:
供稿:網(wǎng)友

  

 

  Class 類

 

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

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

練習(xí):

用let關(guān)鍵字添加一個(gè)常量屬性,添加另一個(gè)方法用來接收參數(shù)。

 

  在類名后面加小括號(hào)來創(chuàng)建類的實(shí)例化,使用.(點(diǎn)號(hào)連接符)來訪問實(shí)例的方法和屬性:

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

 

  這個(gè)版本的Shape類缺少一個(gè)重要的東西:構(gòu)造器--類被創(chuàng)建后的設(shè)置??梢允褂胕nit來創(chuàng)建一個(gè):

 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是用來區(qū)分構(gòu)造器內(nèi)的name參數(shù)和name屬性的。創(chuàng)建類的實(shí)例時(shí),構(gòu)造器里的參數(shù)傳遞和函數(shù)的參數(shù)傳遞形式是一樣的。每個(gè)屬性都需要為其指定一個(gè)值,無論是在聲明中(如nameOfSides),或是在構(gòu)造器內(nèi)(如name)。

  使用 deinit 來創(chuàng)建一個(gè)析構(gòu)器,來執(zhí)行對(duì)象銷毀時(shí)的清理工作。

 

  繼承和多態(tài)

 

  子類可以加冒號(hào)后直接跟超類名,子類聲明時(shí)并不需要非得制定任何標(biāo)準(zhǔn)基類,所以子類后的超類可以被忽略。

  子類的方法覆蓋或重載超類中的實(shí)現(xiàn)要加上override標(biāo)記,否則,編譯器會(huì)報(bào)錯(cuò),編譯器也會(huì)檢測(cè)被標(biāo)記為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()

 

練習(xí):

編寫另一個(gè)NamedShape的子類:Circle ,傳入半徑和名字作為參數(shù)到其構(gòu)造器,并在Circle類中實(shí)現(xiàn)area和describe方法。

  此外,聲明過的屬性通常還有一個(gè)get和一個(gè)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中值的默認(rèn)名是newValue,你可以再set后面以小括號(hào)的方式為其指定其它的名字。

  請(qǐng)注意, EquilateralTriangle類的構(gòu)造器有三個(gè)不同的步驟:

    第一步,設(shè)置子類各個(gè)屬性的值;

    第二步,調(diào)用超類的構(gòu)造器;

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

  如果你不需要計(jì)算屬性的值,但是想在設(shè)置屬性值之前或之后執(zhí)行代碼,那么你可以使用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

 

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

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)

 

  當(dāng)與可選值(詳見第三章的If語句介紹)一起工作時(shí),你可以在方法或?qū)傩郧皩?"?" 操作符。如果值在"?"之前就已經(jīng)是 nil ,所有在 "?" 之后的都會(huì)自動(dòng)忽略,而整個(gè)表達(dá)式是 nil 。另外,可選值是未封裝的,所有 "?" 之后的都作為未封裝的值。在這兩種情況中,整個(gè)表達(dá)式的值是可選值:

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

 

 

 

 謝謝,Swifter-QQ群:362232993,同好者進(jìn)~ 

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

 

 

  

 

 

 

 

 

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 春光影院理论片 | 一级黄色电影网站 | 精精国产xxxx视频在线播放7 | 三级xxxx| www.com香蕉 | 在线观看中文字幕国产 | 免费1级做55爰片l在线观看 | 日本黄色免费片 | 91久久精品一区二区 | 亚洲一区二区三区日本久久九 | 久久亚洲春色中文字幕久久 | 免费黄色大片在线观看 | 免费a级片在线观看 | 真人一级毛片免费 | 欧美日比视频 | 欧美精品色精品一区二区三区 | 国产一级毛片国产 | 免费观看黄视频 | 欧美日韩国产综合网 | 久久国产精品久久久久 | 国产成人高潮免费观看精品 | 国产精品性夜天天视频 | 一区二区国产在线 | 视频一区二区在线观看 | 毛片免费视频观看 | 一级做a爱片久久毛片a高清 | 高清av在线 | 久草在线综合网 | 亚洲成人免费视频在线 | 日本一区二区不卡在线观看 | 91午夜在线观看 | 精品国产一区二区三区久久久蜜月 | 久久久久国产一区二区三区不卡 | 欧美一级做性受免费大片免费 | 5a级毛片| 永久av在线免费观看 | 成人免费看视频 | 久久国产免费 | 欧美性生活视频免费看 | 成人在线激情视频 | 免费在线观看国产精品 |