swift 初始化

知識點總結:swift

一、結構體ide

1.一、默認初始化方法:一、空初始化方法;二、成員初始化方法函數

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.二、自定義初始化方法和委託初始化方法ui

一旦有了本身的初始化方法,swift就不會提供默認的初始化方法。swift編譯器容許在初始化過程當中初始化常量屬性。spa

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)")

二、類初始化code

2.一、默認初始化方法blog

swift 只會提供一個默認的空初始化方法。繼承

2.2 指定初始化方法和便捷初始化方法編譯器

通常來講,類不會繼承父類的初始化方法,由於swift但願避免子類在不經意間提供沒法爲全部屬性賦值的初始化方法(子類常常會增長父類不存在的屬性)。讓子類提供本身的初始化方法能夠避免實例被不完整的初始化方法初始化。不過,類確實會在一些狀況下自動繼承父類的初始化方法。若是子類爲全部新增的屬性提供了默認值,那麼在如下兩種場景下,類會繼承父類的初始化方法。it

  • 若是子類沒有定義任何指定初始化方法,就會繼承父類的指定初始化方法。
  • 若是子類實現了父類的全部指定初始化方法(不管是經過顯示實現仍是隱式繼承),就會繼承父類的全部便捷初始化方法

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.三、必需初始化方法

一個類能夠要求子類提供特定的初始化方法。

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.四、反初始化

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

三、可失敗的初始化方法

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
    }
}
相關文章
相關標籤/搜索