• iOS-swift-类和对象


    1.类(class)

        使用关键字 class 创建一个类。属性直接在类里面声明,属性可以是变量,也可以是常量。方法和函数的创建方法一致。

        class Shape {
            var numberOfSides = 0
            func simpleDescription() -> String {
                return "A shape with (numberOfSides) sides."
            }
        }

    2.对象(object)

        对象的创建很容易。在类名后面加一个圆括号就可以创建类的实例。使用 “.” 访问实例的属性和方法。

        var shape = Shape()
        shape.numberOfSides = 7
        var shapeDescription = shape.simpleDescription()

        上面的类 Shape 比较简单。下面的Shape在初始化的时候对属性进行设置,使用到了初始化方法 init。

        class NamedShape {
            var numberOfSides: Int = 0
            var name: String
            
            init(name: String) {
                self.name = name
            }
            
            func simpleDescription() -> String {
                return "A shape with (numberOfSides) sides."
            }
        }

         注意,在 init 方法里面,使用 self 区分成员变量 name 和 参数 name。

         有默认初始化方法 init, 就有默认销毁方法 deinit,如果对象在销毁时有需要清理,可以实现deinit 方法做清理操作。

    3.子类(subclass)

        在类名后面加上父类名字,用冒号区分,这个类就是子类。

        子类可以使用关键字 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()

        可以给类中的属性添加 get 和 set 方法。

    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)
    triangle.perimeter = 9.9
    print(triangle.sideLength)

         值得注意,在 初始化方法里面做了三步。

    • 对子类属性赋值
    • 调用父类初始化方法
    • 修改父类的属性值

        如果想在给属性值赋值之前或者之后做一些操作,可以使用 关键字 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)
        print(triangleAndSquare.triangle.sideLength)
        triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
        print(triangleAndSquare.triangle.sideLength)

        类的实例也可以作为可选值。

       

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

    恩,努力!

  • 相关阅读:
    Redis数据类型及操作详解
    【Linux】——搭建redis
    【Linux】——搭建nexus
    更多体会,更多收获!(2015年终总结)
    【WebService】——入门实例
    HashSet如何判定两个元素相同
    WEB-INF目录
    Java基础——集合
    从零开始配置Jenkins(三)——用户权限管理
    Activiti工作流(三)——流程变量
  • 原文地址:https://www.cnblogs.com/mengdongsky/p/7040626.html
Copyright © 2020-2023  润新知