• Swift-9-类和结构体


    // Playground - noun: a place where people can play
    
    import UIKit
    
    // 几个重要的概念Properties/Methods/Subscripts/Initialization/Extensions/Protocols/Inheritance/Type Casting/Deinitialization/Automatic Reference Counting
    // 定义语法
    class someClass {
        // 定义其它内容,如属性,方法,下标,初始化方法等等
    }
    
    // 属性 Properties
    // 存储属性
    class Person {
        var name : String = "Anna"
        var age : Int = 20
    }
    
    // 延迟存储属性[第一次使用时才进行初始化的属性,只能是var]
    class Dog {}
    class PersonContainsDog {
        lazy var dog : Dog = Dog()
    }
    var pcd = PersonContainsDog()
    //pcd.dog 调用此行代码时才会去初始化dog属性
    
    // 计算属性
    class Square {
        var width : Double = 0.0
        var girth : Double {
            get {
                return width * 4
            }
            
            set {
                width = newValue / 4 // 和OC类似,这里set有个默认参数newValue表示即将设置的值
            }
        }
    }
    
    var s = Square()
    s.girth = 20
    println("s width is (s.width)")
    
    // 只读属性。对于只读计算属性,可以简写,直接return,不用写set,get关键字
    class Cuboid {
        var width = 0.0, height = 0.0, depth = 0.0
        var volume : Double {
            return width * height * depth
        }
    }
    
    // 属性监听器
    class PropertyObserver {
        var count : Int {
            willSet {
                println("willSet:(newValue)")
            }
            
            didSet {
                println("didSet:(oldValue)")
            }
        }
        
        init() {
            count = 1
        }
    }
    
    class PropertyObserverSubclass: PropertyObserver {
        override var count : Int {
            willSet {
                println("willSet:(newValue)-sub")
            }
        }
    }
    
    var p = PropertyObserverSubclass()
    p.count = 2
    
    // 注意:1.提供了set方法时,无法再提供willSet,因为在set方法里便可以监听属性改变 2.willSet和didSet在属性初始化的过程中不会调用,只有当属性的值在初始化之外的地方被设置时才调用
    
    // 类属性 使用class声明的
    class SomeClass {
        class var someClassProperty : Int {
            return 20
        }
    }
    
    // 方法
    // 实例方法:只能用对象实例调用的方法,也成为“对象方法” 对应OC中 “-” 开头的方法
    class Counter {
        var count = 0
        func increment() {
            count++
        }
    }
    
    var counter = Counter()
    counter.increment() // 通过实例变量调用
    
    // 方法的局部和外部参数 默认方法内的局部参数名也是外部参数名,相当于默认加 #
    class CounterBy {
        var count = 0
        func incrmentBy(amount: Int, numbersOfTimes: Int) {
            count += amount * numbersOfTimes
        }
        // 下面的写法与上面一致
    //    func incrmentBy(amount: Int, #numbersOfTimes: Int) {
    //        count += amount * numbersOfTimes
    //    }
        // 下面的写法为第一个参数生成外部变量名, 同时取消第二个参数的默认外部参数名 因为参数是方法的一部分,所以下面的方法与第一个方法是不同的,写在一起不会报错
        func incrmentBy(#amount: Int, _ numbersOfTimes: Int) {
            count += amount * numbersOfTimes
        }
        
        // 参数名作为方法的一部分,参数不同,方法不同. 所以此方法可以与第一个共存
        func incrmentBy(amount: Int, someTimes: Int) {
            count += amount * someTimes
        }
    }
    
    var counterBy = CounterBy()
    counterBy.incrmentBy(3, numbersOfTimes: 4)
    counterBy.incrmentBy(amount: 3, 4)
    counterBy.incrmentBy(3, someTimes: 4)
    
    // 类型方法 使用class关键字修饰,可以直接通过类型调用
    class Calculator {
        class func sum(num1: Int, num2: Int, num3: Int) -> Int {
            return num1 + num2 + num3
        }
    }
    
    Calculator.sum(1, num2: 2, num3: 3)
    
    // self 同OC中self一样. 在方法内部,self表示方法调用者本身,可以是实例,也可以是类
    
    // 附属脚本subscript
    // 基本用法 基本用法同方法,可以重载
    class someList {
        var name = "someList"
        subscript(index: Int) -> String{
            return name + "(index)"
        }
        
        subscript(prefix: String) ->String{
            return prefix + name
        }
        
        subscript(num1: Int, num2: Int) -> Int {
            return num1 + num2
        }
    }
    
    var somelist = someList()
    somelist[10]
    somelist["hello, "]
    somelist[2, 6]
    
    // 继承 inheritance 与OC基本一致
    // 重写方法, 对重写的方法加override关键字
    class Animal {
        var age = 3
        func run() {
            println("animal-->func run")
        }
    }
    
    class Cat: Animal {
        override func run() {
            println("Dog-->override func run");
            super.run()
        }
    }
    // 重写属性 1、可以将存储属性重写为计算属性 2、可以将只读属性重写为读写属性 3、不可以将读写属性重写为只读属性
    class CatForAge : Animal {
        override var age: Int {
            set {
                super.age = newValue * 2 // 注意不能使用self.age,会导致死循环。应调用super的set方法
            }
            
            get {
                return super.age * 10 // 注意不能使用self.age 会导致死循环。应调用super的get方法
            }
        }
    }
    var cat = CatForAge()
    cat.age = 5
    cat.age
    
    // 重写属性观察 property observer 重写之后,仍会调用父类的willSet和didSet
    class CatForPropertyOberver :Animal {
        override var age: Int {
            willSet {
                println("CatForPropertyOberver-WillSet")
            }
            
            didSet {
                println("CatForPropertyOberver-DidSet")
            }
        }
    }
    var catFPO = CatForPropertyOberver()
    catFPO.age = 4
    
    // 防止重写 final 使用final修饰的属性,方法,脚本无法被重写
    class CatForFinal : Animal {
        final var name = "final" // 子类重写该属性时会报错。方法和脚本类似
    }
    
    // 构造 initialization 原则,保证所有的属性初始化完成
    // 1、没有默认值的存储属性,要在初始化过程中赋值 2、初始化过程中为属性赋值不会触发属性观察器 3、便利构造方法相当于对指定构造方法的封装 4、子类的指定构造方法默认会调用父类的无参指定构造方法
    class Color {
        let red, green, blue: Double
        init(red: Double, green: Double, blue: Double) {
            self.red = red
            self.green = green
            self.blue = blue
        }
        
        convenience init(black: UIColor) {
            self.init(red: 255.0, green: 255.0, blue: 255.0)
        }
    }
    var c = Color(red: 255, green: 255, blue: 255)
    var anotherC = Color(black: UIColor.blackColor())
    
    // 析构 和dealloc一样. 主要用来释放资源,且不可主动调用
    class SomeObj {
        deinit {
            println("someobj dealloc or deinit")
        }
    }
  • 相关阅读:
    PHP程序员应该知道的15个库
    MongoDB、Cassandra 和 HBase 三种 NoSQL 数据库比较
    四种常见的POST提交数据方式
    PHP中获取文件扩展名的N种方法
    【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群(三)
    【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群(二)
    【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群(一)
    ZF框架数据对象映射模式的思考
    概念大集合:单一入口、MVC、ORM、CURD、ActiveRecord...
    有默认参数的函数,默认参数为何需后置
  • 原文地址:https://www.cnblogs.com/liufeng24/p/4117193.html
Copyright © 2020-2023  润新知