swift构造方法|便利构造方法定义用法解析

一.构造函数的介绍

  • 构造函数类似于OC中的初始化方法:init方法
  • 默认情况下载创建一个类时,必然会调用一个构造函数
  • 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。
  • 如果是继承自NSObject,可以对父类的构造函数进行重写。
  • 构造函数不用写func。

二.构造函数的基本使用

构造函数的基本使用

  • 类的属性必须有值
  • 如果不是在定义时初始化值,可以在构造函数中赋值
class Person: NSObject {
    var name : String
    var age : Int

    // 重写了NSObject(父类)的构造方法
    override init() {
        name = ""
        age = 0
        super.init()
    }
}

// 创建一个Person对象
let p = Person()

初始化时给属性赋值

  • 很多时候,我们在创建一个对象时就会给属性赋值
  • 可以自定义构造函数
  • 注意:如果自定义了构造函数,会覆盖init()方法.即不在有默认的构造函数
class Person: NSObject {
    var name : String
    var age : Int

    // 自定义构造函数,会覆盖init()函数
    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }
}

// 创建一个Person对象
let p = Person(name: "why", age: 18)

字典转模型初始化(利用KVC转化)

1.利用KVC字典转模型会更加方便
2.注意:

  • KVC并不能保证会给所有的属性赋值
  • 因此属性需要有默认值
  • 基本数据类型默认值设置为0
  • 对象或者结构体类型定义为可选类型即可(可选类型没有赋值前为nil)
class Person: NSObject {
    // 结构体或者类的类型,必须是可选类型.因为不能保证一定会赋值
    var name : String?

    // 基本数据类型不能是可选类型,否则KVC无法转化
    var age : Int = 0

    // 自定义构造函数,会覆盖init()函数
    init(dict : [String : NSObject]) {
        // 必须先初始化对象
        super.init()

        // 调用对象的KVC方法字典转模型
        setValuesForKeysWithDictionary(dict)
    }
}

// 创建一个Person对象
let dict = ["name" : "why", "age" : 18]
let p = Person(dict: dict)

三.便利的构造函数

1.convenience 关键字修饰的构造方法就是便利构造函数
2.便利构造函数具有以下特点:

  • 可以返回 nil
  • 只有便利构造函数中可以调用 self.init()
  • 便利构造函数不能被重写或者 super
  • 便利构造函数可以返回nil,也可以被继承

3.便利构造函数应用场景

  • 根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
  • 在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建
convenience init?(name : str , age:int){
     if(age<10){
        //不符合创建规则就创建空的对象
        return nil;
     }
    self.init(dic:["name":name,"age":age])
    //注意:在调用self.init之后才可以对属性进行操作
    self.sex = "man"
}

That's all,THX,欢迎小伙伴的交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容