关于Designated, Convenience 和 Required 区别

原创 2016年08月31日 11:04:47

关于Designated, Convenience 和 Required 区别
1.Designated (指定的)
顾名思义 在本文章中指的就是“Designated初始化方法”
在OC中,Init方法是非常不安全的,因为不能确保init只被调用一次,同时也不能确保init初始化方法调用后,实例内的每个变量都已经完成初始化。 因此在 Swift里对初始化方法加强了规范,确保每个实例初始化后,其内部的成员变量都已经完成初始化。
期间笔者还遇到一个小问题,let类型作为一个不变量 是不能被赋值的(这是对于构建线程安全的API很有用)。而在init方法里是可以进行赋值的,后来翻阅资料了解到,Swift的init方法只能被调用一次,所以在init方法中才可以赋值,而不会引起任何线程安全的问题。

2.Convenience (便利)
Convenience这类方法是Swift初始化方法中的“二等公民”相当于只要父类里面存在,我们就可以在子类中就可以使用。但是需要注意到的是Convenience的初始化方法是不能被子类重写或从子类中以super的方式调用。相当于子类不需要重写父类的这个初始化方法就可以使用
/示例/
class People {

var name: String

init() {

    name = "qq"

}

convenience init(number: Int) {
    self.init()
    name = String(number)
}

}

class TempPeople: People {

let page: Int

override init() {

    page = 10

}

}

/没有重写调用/
let model = TempPeople(number: 5)

3.Required (必需的)
如果你有一个父类的方法 必需强制要求所有子类重写,那就用到了Required。
/示例/

class People {

var name: String

required init() {

    name = "qq"

}

convenience init(number: Int) {
    self.init()
    name = String(number)
}

}

class TempPeople: People {

let page: Int

required init() {

    page = 10

}

}

这里的 TempPeople子类就必需要实现父类的init()方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

[待添加]swift3.0 初始化方法中,你所不知道的事 Designated, Convenience, required

在swift中,初始化需要达成的目的只有一个 "安全" 在Objective-C中,init方法其实很不安全,在对象被创建后,并不能保证其中的方法都会初始化, 导致各种各样的奇葩问题出现. 所以s...

Swift——convenience(便利构造函数)和类方法

import UIKit extension UIButton{ //swit中类方法是以class开头的方法,类似于oc中+开头的方法 class func create...

Swift 类的继承 convenience required

看下面的代码 class Person { var name: String var health:Int = 100 { didSet{ if...

swift init()函数总结

swift初始化函数总结一、很多情况下init方法并不是必须的 let常量可以用=号赋值好 var变量,可以先设置为nil(注意nil也是一个值) 属性可以用闭包给它初始化一个值 通过lazy机制 c...

swift - Designated Initializer & Convenience Initializers

Designated initializers tend to set all of the properties up and let the user send in values for eac...

protobuf的配置原始文件.proto中,使用修饰符repeated、required、optional生成的java文件的区别

最近在做一个基于Netty框架的项目。 该项目使用了Google的Protobuf作为编解码的框架。(没有使用XML或者json是为了更好的提高效率)。 经过了一段时间的使用我对Protobuf的原始...
  • lxlhu
  • lxlhu
  • 2015年04月20日 11:01
  • 2645

关于OSGI模块化编程中MENIFEST.MF文件中的Required Plug-ins和Imported Packages的区别

转载来自:http://blog.csdn.net/qimiguang/article/details/21371495 最近在做一个“把OSIG上的bundle结构的工程打成标准的...
  • zhx1019
  • zhx1019
  • 2015年01月14日 10:46
  • 817

getCurrentSession()与openSession()的区别&&PROPAGATION_REQUIRED事务管理

转载:getCurrentSession()与openSession()的区别&&PROPAGATION_REQUIRED事务管理 采用编程式事务 1、 getCurrentSessi...

Convenience initialzer missing a self call to another initializer警告

Convenience initialzer missing a self call to another initializer警告

SQlite数据库的C编程接口(五) 便捷函数(Convenience Functions) ——《Using SQlite》读书笔记

SQlite数据库的C编程接口(五) 便捷函数(Convenience Functions)  by斜风细雨QQ:253786989    2012-02-07   SQlite拥有很多早期遗留...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Designated, Convenience 和 Required 区别
举报原因:
原因补充:

(最多只允许输入30个字)