Swift学习—对象和类

前端之家收集整理的这篇文章主要介绍了Swift学习—对象和类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

class后面跟类名来创建一个类。除了上下文是类以外,声明一个属性和常量,变量声明是一样的,方法函数也是如此。

  1. class Shape {
  2. var numberOfSides = 0
  3. func simpleDescription() -> String {
  4. return "A shape with \(numberOfSides) sides."
  5. }
  6. }
试一试:

添加一个常量属性,再添加一个含一个参数的函数

通过在类名的后面加小括号来创建这个类的实例。用点语法来访问这个实例的属性方法

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

上个版本的Shape类缺失了一个重要的东西:通过初始化器来创建一个实例。用init来 创建一个。

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

值得注意的是这里用self来区分name属性还是参数。创建一个类的实例时这里的参数传递就像函数调用时的参数传递一样。每一个属性都需要赋值,在声明的时候(如numberOfSides)或是在初始化器中(如name)。

当你需要在对象释放前做一些清理工作,可以用deinit来创建一个析构器。

子类类名后面是父类名,中间用冒号: 隔开。没有强求子类要有标准的根类,所以可以根据需要省略父类

子类的方法要覆盖父类方法的实现时,要用override标记,如果不加的话,编译器会报错。编译器同时也检测子类标记override方法是否真正的覆盖了父类方法的实现。

  1. class Square: NamedShape {
  2. var sideLength: Double
  3. init(sideLength: Double,name: String) {
  4. self.sideLength = sideLength
  5. super.init(name: name)
  6. numberOfSides = 4
  7. }
  8. func area() -> Double {
  9. return sideLength * sideLength
  10. }
  11. override func simpleDescription() -> String {
  12. return "A square with sides of length \(sideLength)."
  13. }
  14. }
  15. let test = Square(sideLength: 5.2,name: "my test square")
  16. test.area()
  17. test.simpleDescription()

试一试:

写一个继承自NameShape的子类Circle,初始化器中接收radiusname参数。并实现areadescribe方法

除了简单的存储属性属性还有gettersetter方法

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

perimetersetter方法中,新值有一个隐式的名newValue.你可以在set方法的后面加一个括号显式的提供一个新值名字。

对于EquilateralTriangle中的初始化器做了三件事:

1.设置子类声明的属性的值

2.调用父类的初始化器

3.改变被父类定义的属性值。当然通过其他的如方法getter,setter,都可以完成这一点。

如果你不需要计算属性但是又需要在设置一个新值之后,在运行之前提供一些代码,可以用willsetdidset。比如,下面的类确保了三角形和正方形的边长都相同。

  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.sideLength
  10. }
  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.sideLength
  19. triangleAndSquare.triangle.sideLength
  20. triangleAndSquare.square = Square(sideLength: 50,name: "larger square")
  21. triangleAndSquare.triangle.sideLength

类中的方法函数有一个重要的不同点,函数的参数名只能在函数中使用,但是方法中的参数名在你调用方法时还需要用上(第一个参数的参数名除外)。默认情况下,方法的参数名在调用或在方法内部使用时是相同的,你可以标识第二个名字,在方法中使用。

  1. class Counter {
  2. var count: Int = 0
  3. func incrementBy(amount: Int,numberOfTimes times: Int) {
  4. count += amount * times
  5. }
  6. }
  7. var counter = Counter()
  8. counter.incrementBy(2,numberOfTimes: 7)

当用到optional值时,你可以在操作之前加一个问号。如果在之前的值是nil,那么问号之后的代码就被忽略,都被视为是nil。否则,这个optional值被解包,问号之后的就作为解包值。下面两种情况下,整个表达式的值都是一个optional值。

  1. let optionalSquare: Square? = Square(sideLength: 2.5,name: "optional square")
  2. let sideLength = optionalSquare?.sideLength

猜你在找的Swift相关文章