美文网首页selectorswift 基础
一、关于swift class初始化

一、关于swift class初始化

作者: 10m每秒滑行 | 来源:发表于2018-01-03 17:00 被阅读0次

很久不写swift了,回头再想拿它写App时发现,忘了。。。。。

那就从头再来,边学边写写笔记,供自己挤地铁的时候看一眼~

因为臭毛病,上来开始就是class,然后按照我在oc里留下的习惯,接着写初始化方法,然后就怎么写都不对,是要搞什么鬼,就是个初始化呀!

正文:

swift里所有的class初始化规则:


屏幕快照 2018-01-03 下午4.11.48.png

举例:

1.当前class为基类,所有属性都有默认值时,可以有类的初始化方法,也可以不实现类的初始化方法。当不实现类的初始化方法时,编译器会为类提供默认的初始化方法,构造生成的实例的每个属性的值都为默认值。

class Person {
    var name :String?
    var age :Int=0
}

此种情况下也可以为类实现初始化方法。(下文中构造方法即初始化方法)

当不指定默认值时,类必须实现指定构造方法(designed)

class Person {
    var name : String
    var age : Int
    
    init () {
        name = ""
        age = 0
    }
}

2.当class有父类时,指定构造器必须调用其直接父类的的指定构造器

class Person : NSObject {
    var name : String
    var age : Int
    
    init (name:String) {
        self.name = name
        self.age = 0
        super.init();
    }
}

子类也可以复写父类的designed构造方法

class Person : NSObject {
    var name : String
    var age : Int
    
    override init () {
        self.name = ""
        self.age = 0
        super.init()
    }
}

但是调用父类的designed的方法之前,必需要初始化子类所有属性的值

3.当子类有convenience构造方法时,convenience构造方法必需要调用designed构造方法

class Person : NSObject {
    var name : String
    var age : Int
    
    init(name:String, age:Int) {
        self.name = name;
        self.age = age;
        super.init()
    }
    
   convenience init (name:String) {
    self.init(name:name,age:0);
    }
    
   convenience init(age:Int) {
        self.init(name: "Mingming",age:age)
    }
}

总结:
1. 每个class 保证至少有一个初始化方法,可以是默认的,也可以是designed的

2.保证初始化完成后,每个property都有一个初始值,无论是定义时声明的,还是初始化时赋值的。

3. 如果class有继承关系,当子类class不实现构造方法时,子类将自动从父类class继承初始化方法。

4.当class的所有属性,在定义时显示或隐式的给出了默认值,那么当不写当前类的初始化方法,编译器会为该类生成默认的初始化方法。如果,属性定义时部分未给出默认值,也不实现类的构造方法,则编译报错。

5.class的初始化方法,分为designed和convenience两种,designed初始化方法,是类的完整构造方法,也可以说是基础构造方法,需要保证类的所有属性都具备初始值。convenience构造方法是类的便捷构造方法,提供某些初始化完成后的特色操作,根据需求,对类做一些特殊处理。convenience初始化方法必须要调用designed初始化方法。

相关文章

网友评论

    本文标题:一、关于swift class初始化

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