美文网首页
Swift--- 对象和类

Swift--- 对象和类

作者: 彬至睢阳 | 来源:发表于2018-11-25 17:53 被阅读0次

    使用类后跟类名创建类。类中的属性声明与常量或变量声明的编写方式相同,只是它位于类的上下文中。同样,方法和函数声明的编写方式也是一样的。

         class Shape {

         var numberOfSides = 0

         func simpleDescription() -> String {

         return "A shape with \(numberOfSides) sides."

         }

         }

         注意self是如何将name属性从name参数区分为初始化器的。初始化器的参数在创建类的实例时像函数调用一样传递。每个属性都需要一个指定的值——无论是在声明(如numberOfSides)中还是在初始化器(如名称)中。

         如果在释放对象之前需要执行一些清理,可以使用deinit创建deinitializer。

         子类在类名之后包含它们的超类名,用冒号分隔。类不需要子类化任何标准的根类,因此可以根据需要包含或省略超类。

         重写超类实现的子类上的方法被标记为覆盖方法,这是意外发生的,没有覆盖,编译器会将其检测为错误。编译器还会检测带有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 triangle with sides of length \(sideLength)."

         }

         }

         var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")

         print(triangle.perimeter)

         // Prints "9.3"

         triangle.perimeter = 9.9

         print(triangle.sideLength)

         // Prints "3.3000000000000003"

         设置子类声明的属性值。

         调用超类的初始化器。

         更改父类定义的属性的值。此时还可以完成任何使用方法、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")

         print(triangleAndSquare.square.sideLength)

         // Prints "10.0"

         print(triangleAndSquare.triangle.sideLength)

         // Prints "10.0"

         triangleAndSquare.square = Square(sideLength: 50, name: "larger square")

         print(triangleAndSquare.triangle.sideLength)

         // Prints "50.0"

    相关文章

      网友评论

          本文标题:Swift--- 对象和类

          本文链接:https://www.haomeiwen.com/subject/tnpwxqtx.html