美文网首页
Swift基础小结2

Swift基础小结2

作者: 罗小耳 | 来源:发表于2016-08-11 10:30 被阅读20次


    一、类的介绍和定义

    1. swift也是一门面向对象开发的语言
      2.面向对象的基础是类,类产生了对象
      3.在swift中如何定义类呢?
      class是类的关键字,用来定义类
      class 类名 superClass {
      // 定义属性和方法
      }
      注意:
      1. 定义的类,可以没有父类,那么该类是rootClass
      2. 通常情况下,定义类时,继承自NSObject(非OC的NSObject)
      二、如何定义类的属性
      Swift中类的属性有多种
    2. 存储属性:存储实例的常量和变量
    3. 计算属性:通过某种方法计算出来的属性
    4. 类属性:与整个类自身相关的属性
      存储属性
      存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量
      可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化
    /*
     * 1. 类的定义
     * 2. 创建类的对象
     * 3. 给类的属性赋值
         1> 直接赋值
         2> 通过KVC赋值
     * 4. 可以重写setValue(value: AnyObject?, forUndefinedKey key: String),那么字典中没有的字段可以在类中没有对应的属性
     * 5. override:重写,如果写的某一个方法是对父类的方法进行重写,那么必须在该方法之前加上override
     */
    
    class Person : NSObject {
        var age : Int = 0
        
        // 重写父类的方法
        // override:重写,如果写的某一个方法是对父类的方法进行重写,那么必须在该方法之前加上override
        override func setValue(value: AnyObject?, forUndefinedKey key: String) {
            
        }
    }
    
    let p = Person()
    p.age = 20
    p.setValuesForKeysWithDictionary(["age": 18, "name": "lmj"])
    print(p.age)
    
    

    类的属性代码示例

    class Student: NSObject {
        // 定义属性
        // 定义存储属性
        var age: Int = 0
        var name : String? = nil
        
        var mathSource : Double = 0.0
        var chineseSource : Double = 0.0
        
        // 定义计算属性:通过别的方式计算到结果的属性,称之为计算属性
        var averageSource : Double {
            return (mathSource + chineseSource) * 0.5
        }
        
        // 定义类属性:类属性是跟整个类相关的属性,而且是通过类名进行访问
        static var courseCount : Int = 0
        
        
        
        /*
        // 定义一个方法,可以返回平均成绩
        func getAverageSource() -> Double {
            // 在swift开发中,如果使用当前对象的某一个属性,或者调用当前对象的某一个方法时,可以直接使用,不需要加self
            return (mathSource + chineseSource) * 0.5
        }
        */
    }
    
    // 创建对象
    let stu = Student()
    // 给对象的属性赋值
    stu.age = 10
    stu.name = "xxs"
    stu.mathSource = 120
    stu.chineseSource = 59
    
    print(stu.age)
    if let name = stu.name {
        print(name)
    }
    

    类的构造函数

    1. 构造函数类类似于OC中的初始化方法:Init方法
    2. 默认情况下创建一个类时,必然会调用一个构造函数
    3. 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数
    4. 如果是继承自NSObject,可以对父类的构造函数进行重写
      init(name : String, age : String) {self.name = name, self.age = age}
      init(dict: [String : AnyObject]) {dict["name"], dict["age"]} as? as!
      init(dict: [String: AnyObject]) {super.init() setValueeForKeysWithDic:dict}
    class Person: NSObject {
        var name : String?
        var age : Int = 0
        
        override init() {
            // 在构造函数中,如果没有明确super.init(),那么系统将会帮助调用super.init()
    //         super.init()
            print("----------")
        }
        
        // 自定义构造函数
        init(name : String, age : Int) {
            self.name = name
            self.age = age
        }
        
    //    init(dict : [String: AnyObject]) {
    //        let tempName = dict["name"]
    //        // tempName是一个AnyObject?转成String
    //        // as? 最终转成的类型是一个可选类型
    //        name = tempName as? String
    //        
    ////        let tempAge = dict["age"]
    ////        age = tempAge as! Int
    //        // tempName是一个AnyObject?转成String
    //        // as! 最终转成的类型是一个不可选类型,最好不要这样强制解包
    //        /*
    //        let tempAge1 = tempAge as? Int
    //        if tempAge1 != nil {
    //            age = tempAge1
    //        }
    //        */
    //        
    //        if let tempAge = dict["age"] as? Int {
    //            age = tempAge
    //        }
    //        
    //    }
        
        // 通过kvc给构造函数中的属性赋值
        init(dict : [String: AnyObject]) {
            super.init()
            
            setValuesForKeysWithDictionary(dict)
        }
        
        override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    }
    
    let p = Person()
    let p1 = Person(name: "lmj", age: 18)
    print(p.name)
    print(p1.name)
    
    let p2 = Person(dict: ["name": "we", "age": 15, "height": 120])
    print(p2.name)
    

    类里面监听属性的改变使用属性监听器进行监听

    // 如何监听某一个类中的属性的改变,可以通过属性监听器来监听属性的改变
    class Person: NSObject {
        // 属性监听器
        var name : String? {
            // 监听属性是否改变
            // willSet:属性即将改变时进行监听
            willSet {
                print(name)
                print(newValue)
            }
            
            // didSet:属性已经改变时进行监听
            didSet {
                print(name)
                print(oldValue)
            }
        }
        
    }
    
    let p = Person()
    p.name = "why"
    p.name = "dhs"
    
    class MyCell: UITableViewCell {
        var person : Person?
    }
    

    闭包

    1. 闭包和OC中的block非常相似
      1.1 OC中的block是匿名的函数
      1.2 Swift中的闭包是一个特殊函数
      1.3 block和闭包经常用于回调
      注意:闭包和block一样,第一次使用时可能不习惯它的语法,可以先按照使用简单的闭包,随着学习的深入,慢慢掌握其灵活的运用方法
    2. 闭包的基本写法
      callBack : (参数列表) -> (返回值类型)
      3.闭包的循环引用
      1.weak var weakSelf = self weakSelf?
      2. [weak self] self? (推荐使用)
      3. [unowned self] self
      4.尾随闭包
        // 闭包的类型:(参数列表) -> (返回值类型)
    
    HttpTool类
    
        func loadData(callBcak : (jsonData : String) -> ()) {        
            dispatch_async(dispatch_get_global_queue(0, 0)) {
                print("发送网络请求:\(NSThread.currentThread())")
                
                dispatch_sync(dispatch_get_main_queue(), {
                    print("获取到数据,并且进行回调:\(NSThread.currentThread())")
                    
                    callBcak(jsonData: "jsonData数据")
                })
            }
        }
    
    ViewController类
    class ViewController: UIViewController {
        
    //    var tools : HttpTool?
        var tools: HttpTool = HttpTool()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    //        tools = HttpTool()
        }
        
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            /* weakSelf?.view
             如果前面的可选类型,没有值,后面的代码都不会执行
             如果前面的可选类型,有值,系统会自动将weakSelf进行解包,并且使用weakSelf
             */
            
            // 解决循环引用的方式一:
            /*
            // 0x0 -----> nil
            weak var weakSelf = self
            
            tools.loadData { (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                weakSelf?.view.backgroundColor = UIColor.redColor()
             */
            
            
            // 解决循环引用的方式二:(推荐使用该方法)
            tools.loadData {[weak self] (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                self?.view.backgroundColor = UIColor.redColor()
            }
            
            
            // 解决循环引用的方式三:
            tools.loadData {[unowned self] (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                self.view.backgroundColor = UIColor.redColor()
            }
              
             // 尾随闭包:如果闭包作为方法的最后一个参数,那么闭包可以将()省略掉
            // 普通写法:
            tools.loadData ({[unowned self] (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                self.view.backgroundColor = UIColor.redColor()
            })
            
            // 尾随闭包写法一:
            tools.loadData() {[unowned self] (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                self.view.backgroundColor = UIColor.redColor()
            }
            
            // 尾随闭包写法二:
            tools.loadData {[unowned self] (jsonData) in
                // print("在ViewController中拿到数据:\(jsonData)")
                self.view.backgroundColor = UIColor.redColor()
            }
    
        }
        
        // deinit相当于OC中的dealloc方法,当对象销毁时会调用该函数
        deinit {
            print("ViewController-------deinit")
            
        }
    
    }
    

    懒加载
    1.swift中也有懒加载的方式
    (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中去)
    2.和OC中不同的是swift有专门的关键字来实现懒加载

    1. lazy关键字可以用于定义某一个属性懒加载
    懒加载的格式:
    lazy var 变量 : 类型 = {创建变量代码}()
    
    // 懒加载的本质是,第一次使用的时候执行闭包,将闭包的返回值赋值给属性
    // lazy的作用是只会赋值一次
    lazy var array : [String] = {
           () -> [String] in
          return ["www", "cb", "wds"]
    }
     
    

    相关文章

      网友评论

          本文标题:Swift基础小结2

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