Apple Swift语言基础入门 —— Swift概览4
2014-06-08 01:44
453 查看
Swift概览4
根据苹果官方《The Swift Programming Language》2.5 对象和类
在类名前面使用use来创建一个类。除了在类上下文中的属性外,类的属性的声明跟常量或者变量的声明一样。同样,方法和函数也这样声明。
class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } }使用 类名() 来创建一个类的实例。可以使用点语法对实例的方法和属性进行访问。
var shape = Shape() shape.numberOfSides = 7 var shapeDescription = shape.simpleDescription()
这种写法的 Shape类 丢了一个重要的东西:当实例创建的时候设置类的初始化方法(initializer)。
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参数。在你创建类的实例的时候,初始化方法的参数就像函数调用一样被传递了。每一个类属性都应该被赋值——要么在声明的时候赋值(像上面的numberOfSides),要么使用初始化方法赋值(像上面的name)。
如果你需要在对象释放之前做一些清理工作,使用 deinit 创建一个非初始化方法(deinitializer)。
子类在类名后面引用了父类的名字,使用了冒号:隔开。没有要求类必须继承全部的根类,所以可以根据需要包含或者省略一个父类。
子类中覆盖(override)父类的方法需要用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()除了存储的简单属性,属性可以有一个getter方法和setter方法。
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 类的初始化方法init有三个不同的步骤:
1.给子类声明的属性赋值。
2.调用父类的初始化方法。
3.改变父类定义的属性的值。其他的额外的使用方法、getter或者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: "another test shape") triangleAndSquare.square.sideLength triangleAndSquare.triangle.sideLength triangleAndSquare.square = Square(sideLength: 50, name: "larger square") triangleAndSquare.triangle.sideLength类的方法和函数有一个重要的区别。函数中的参数名只在函数中使用,但方法中的参数名在方法调用的时候也要使用(除了第一个参数)。默认情况下,在调用方法时的参数名字和在方法内的参数名字是一样的。你可以指定第二个名字,当然得在方法中使用。
class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes times: Int) { //这里times就是第二个名字,在方法里可以代替numberOfTimes使用 count += amount * times } } var counter = Counter() counter.incrementBy(2, numberOfTimes: 7)在处理可选择性值得时候,可以在像方法、属性和下标的操作之前写上?。如果?前面的值是nil,那么?后面的全部都将被忽略并且整个表达式的值是nil。否则,可选择性值被展开,?后面的全部都会作用于展开的值。在两种情况下整个表达式的值都是可选择性的。
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") let sideLength = optionalSquare?.sideLength
相关文章推荐
- Apple Swift语言基础入门 —— Swift概览1
- Apple Swift语言基础入门 —— Swift概览5
- IOS开发语言Swift入门连载---基础部分
- Apple Swift语言基础教程
- 零基础上手Swift快速入门教程概览
- Swift语言 快速基础入门 (1)
- Swift入门基础概览
- 寄存器(CPU工作原理)06 - 零基础入门学习汇编语言11
- MS SQL入门基础:SQL 语言
- 零基础易语言入门教程(三)之了解控制台程序
- 寄存器(CPU工作原理)05 - 零基础入门学习汇编语言10
- 基础知识04 - 零基础入门学习汇编语言04
- 基础知识05 - 零基础入门学习汇编语言05
- Oracle PL/SQL语言入门基础
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- 寄存器(CPU工作原理)01 - 零基础入门学习汇编语言06
- Java语言基础01-概览
- 基础知识05 - 零基础入门学习汇编语言05
- 基础知识01 - 零基础入门学习汇编语言01