Objects and Classes(對象和類)
用 class 關鍵字后面跟一個類名來創建一個class,在一個類中聲明 常亮或變量,他存在于當前類的上下文,函數的方法是同樣的
var numberOfSides = 0 let numberOfSidesLet = 1 func simpleDescription() -> String { return "A shape with /(numberOfSides) /(numberOfSidesLet) sides." }
通過括號的方式來創建一個類實例,使用點語法來訪問該實例的屬性和方法
var shape = Shape()shape.numberOfSides=10var str = shape.simpleDescription()PRintln(str)
吐槽一下,不知道是xcode6 bate版本問題還是什么原因,寫代碼的提示功能特別差
這個版本的一個重要的修改:在創建的時候設置初始值的項,使用init來創建,如下:
1 class Shape { 2 3 var name:String 4 5 init(name:String) 6 { 7 self.name = name 8 } 9 10 var numberOfSides = 011 let numberOfSidesLet = 112 13 14 func simpleDescription() -> String15 {16 return "A shape with /(numberOfSides) /(numberOfSidesLet) sides."17 }18 }
請注意 self 關鍵字用來區分 屬性name 和 參數 name(這個和oc中的還是一樣)
如果你要釋放一些對象,那么需要創建一個deinitializer,使用deinit來釋放資源
子類和父類之間用 冒號分開,在繼承標準的子類時,不需要聲明,所以可以根據需要來忽略或者包括父類
子類重寫父類的方法要使用overside關鍵字(C#,java比較相似),如果沒有重載,則會提示錯誤
class Square: Shape { 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)" }} var square = Square(sideLength:10.1,name:"my test") square.area() var str = square.simpleDescription() println(str)
除了簡單的屬性,屬性也可以有getter 和 setter方法
1 class EquilateralTriangle: Shape { 2 3 var sideLength:Double = 0.0 4 5 init(sideLength:Double,name:String) 6 { 7 self.sideLength = sideLength 8 super.init(name:name) 9 numberOfSides=310 }11 12 var perimeter:Double13 {14 get{15 return 3.0*sideLength16 }17 set18 {19 sideLength = newValue/3.020 }21 }22 23 override func simpleDescription()->String24 {25 return "An equilateral triagle with sides of length /(sideLength)"26 }27 }28 var triangle = EquilateralTriangle(sideLength:3.1,name:"a triangle")29 println(triangle.perimeter)30 triangle.perimeter = 9.931 println(triangle.sideLength)
在perimeter的setter方法中,新值得隱式名稱是newValue,你可以在setter之后提供一個名字
初始化EquilateralTriangle類有三步:
1. 設置屬性的值
2. 調用父類的構造方法(init)
3. 改變父類定義的屬性值,其他的方法也可以在這里設置
如果你不需要計算屬性,但是在setter之前或者之后執行,可以使用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:"ray test shape") println(triangleAndSquare.square.sideLength) println(triangleAndSquare.triangle.sideLength) triangleAndSquare.square = Square(sideLength:50,name:"larger square") println(triangleAndSquare.triangle.sideLength) println(triangleAndSquare.square.sideLength)//打印出來的值為:10.0,10.0,50.0,50.0
函數和方法有一個不同點,函數的參數名只能在函數中使用,but parameters names in methods are also used when you call the method (except for the first parameter). By default, a method has the same name for its parameters when you call it and within the method itself. You can specify a second name, which is used inside the method(這個不知道怎么翻譯)
1 class Counter { 2 3 var count:Int = 0 4 func incrementBy(amount:Int,numberOfTimes times:Int) 5 { 6 count += amount*times 7 } 8 } 9 var counter = Counter()10 counter.incrementBy(2,numberOfTimes:7)11
當使用可選值時,可以像方法屬性一樣在操作符前使用問號(?),如果值本來就是nil,那所有在?之后的代碼將會忽略,整個表達式都是nil,Otherwise, the optional value is unwrapped, and everything after the ? acts on the unwrapped value. In both cases, the value of the whole expression is an optional value.
1 let optionalSquare :Square?=Square(sideLength:2.5,name:"optional square")2 let sideLength = optionalSquare?.sideLength //注意:等號和optionalSquare之間必須有空格,不知道編譯器為什么會這樣
新聞熱點
疑難解答