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=10 var 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 = 0 11 let numberOfSidesLet = 1 12 13 14 func simpleDescription() -> String 15 { 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=3 10 } 11 12 var perimeter:Double 13 { 14 get{ 15 return 3.0*sideLength 16 } 17 set 18 { 19 sideLength = newValue/3.0 20 } 21 } 22 23 override func simpleDescription()->String 24 { 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.9 31 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
当使用可选值时,可以像方法属性一样在caozuofu.html" target="_blank">操作符前使用问号(?),如果值本来就是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之间必须有空格,不知道编译器为什么会这样