zoukankan      html  css  js  c++  java
  • swift 初始化

    知识点总结:

    1、结构体

    1.1、默认初始化方法:1、空初始化方法;2、成员初始化方法

    struct Person{
        var name = "tom"
        var age = 1
        
    }
    
    let person = Person()//空初始化方法
    print("person:name=(person.name),age=(person.age)")
    
    let person1 = Person(name:"JIM",age:3)//成员初始化方法
    print("person:name=(person1.name),age=(person1.age)")

    1.2、自定义初始化方法和委托初始化方法

    一旦有了自己的初始化方法,swift就不会提供默认的初始化方法。swift编译器允许在初始化过程中初始化常量属性。

    struct Person{
        var name:String
        let age:Int
        
        init(name:String,age:Int){
            self.name = name
            self.age = age
        }
        //委托初始化
        init(name:String){
            self.init(name: name, age: 2)
        }
        
        
    }
    
    let person1 = Person(name:"JIM",age:3)
    print("person:name=(person1.name),age=(person1.age)")

    2、类初始化

    2.1、默认初始化方法

    swift 只会提供一个默认的空初始化方法。

    2.2 指定初始化方法和便捷初始化方法

    一般来说,类不会继承父类的初始化方法,因为swift希望避免子类在不经意间提供无法为所有属性赋值的初始化方法(子类经常会增加父类不存在的属性)。让子类提供自己的初始化方法可以避免实例被不完整的初始化方法初始化。不过,类确实会在一些情况下自动继承父类的初始化方法。如果子类为所有新增的属性提供了默认值,那么在以下两种场景下,类会继承父类的初始化方法。

    • 如果子类没有定义任何指定初始化方法,就会继承父类的指定初始化方法。
    • 如果子类实现了父类的所有指定初始化方法(无论是通过显示实现还是隐式继承),就会继承父类的所有便捷初始化方法

    class Person{
        var name:String
        let age:Int
        
        init(name:String,age:Int){
            self.name = name
            self.age = age
        }
        convenience init(name:String){
            self.init(name: name, age: 0)
        }
    }
    
    class Student:Person{
        var score = 90
        
    }
    
    let stu = Student(name: "li")//因为子类所有新增属性提供了默认值,所以继承父类的指定构造函数和便捷函数
    class Person{
        var name:String
        let age:Int
        
        init(name:String,age:Int){
            self.name = name
            self.age = age
        }
        convenience init(name:String){
            self.init(name: name, age: 0)
        }
    }
    
    class Student:Person{
        var score:Int
        override init(name: String, age: Int) {
            self.score = 40
            super.init(name: name, age: age)
        }
        
    }
    
    let stu = Student(name: "li")//因为子类实现父类所有的置顶初始化方法,所以继承父类的指定构造函数和便捷函数

    2.3、必需初始化方法

    一个类可以要求子类提供特定的初始化方法。

    class Person{
        var name:String
        let age:Int
        
        required init(name:String,age:Int){
            self.name = name
            self.age = age
        }
    }
    
    class Student:Person{
        var score:Int
        required init(name: String, age: Int) {
            self.score = 40
            super.init(name: name, age: age)
        }
        
    }

    2.4、反初始化

    class Person{
        var name:String
        let age:Int
        
        init(name:String,age:Int){
            self.name = name
            self.age = age
        }
        deinit {
            print("deinit")
        }
    }

    3、可失败的初始化方法

    class Person{
        var name:String
        let age:Int
        
        init?(name:String,age:Int){
        self.name = name
        self.age = age
        }
    }
    
    struct Town{
        var region = "left"
        init?(region:String) {
            self.region = region
        }
    }
  • 相关阅读:
    Data Structure Binary Tree: Populate Inorder Successor for all nodes
    Data Structure Binary Tree: Connect nodes at same level using constant extra space
    Data Structure Binary Tree: Check if a given Binary Tree is SumTree
    Data Structure Binary Tree: Construct Tree from given Inorder and Preorder traversals
    Data Structure Binary Tree: Inorder Tree Traversal without recursion and without stack!
    Data Structure Binary Tree: Inorder Tree Traversal without Recursion
    Data Structure Binary Tree: How to determine if a binary tree is height-balanced?
    Data Structure Binary Tree: Diameter of a Binary Tree
    Data Structure Binary Tree: Convert an arbitrary Binary Tree to a tree that holds Children Sum Property
    【阿里云产品公测】OpenSearch初体验
  • 原文地址:https://www.cnblogs.com/yongbufangqi1988/p/8441450.html
Copyright © 2011-2022 走看看