/// 研究一下结构体/类/NSObject的一级初始化和便利初始化方法
struct BatMan {
// 对于一个结构体而言,如果定义了属性而没有显式的定义初始化方法,默认的初始化方法会带出所有的属性
let name: String
let age: String
}
struct Robin {
let name: String
let heigth: Float
// 对于一个结构体而言,如果自定义初始化方法,默认的初始化方法就没有了,必须使用自定义的初始化方法
init(name: String) {
self.name = name
self.heigth = 180
}
// 初始化方法不仅只有一个
init(height: Float) {
self.name = "罗宾"
self.heigth = height
}
}
enum SpiderMan {
// 切记枚举也是结构体的一种,也就是说其实你可以使用它做struct一样的事情 只是对于初始化而言 可能就不是那么好了
case normal
case dark
init() {
self = .normal
}
}
struct SuperChild {
// 定义一个结构体 如果什么都没有写 也是可以写出构造方法的
}
class SuperMan {
// 定义一个类 如果什么都没有写 也是可以写出构造方法的
}
class IronMan {
let name: String
let age: String
// 除非是在定义属性的时候已经赋值给属性,否则的话必须在init方法中对其进行赋值
let sex = "Man"
var height: Float
init(name: String, age: String) {
self.name = name
self.age = age
self.height = 178
}
init(name: String, age: String, height: Float) {
self.name = name
self.age = age
self.height = height
}
}
class TestViewController: UIViewController {
var isNeedCheckNetwork: Bool!
convenience init(isNeedCheckNetwork: Bool) {
// 便利构造函数中 一定不会有super 对于属性的赋值 一般在self.init()之后 只有self被初始化后,才能对其进行赋值, 不能使用let修饰属性 var 并且告诉编译器其强制解包 一定有值
self.init()
self.isNeedCheckNetwork = isNeedCheckNetwork
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TestView: UIView {
var isNeedUpdateLayout: Bool
// 对于一个类 一旦自定义了一个初始化方法(注意是初始化方法,不是便利!),那么其原有的初始化方法就无法使用了,init(frame: CGrect)无法被点出来,而且其添加的属性必须要在super之前调用,在一级初始化中,先初始化自己的属性,再初始化super,这点和便利构造函数不同
init(frame: CGRect, isNeedUpdateLayout: Bool) {
self.isNeedUpdateLayout = isNeedUpdateLayout
super.init(frame: frame)
}
// 如果非要使用默认的初始化方法 请重新, 并正确的为其赋值 赋值原则请看上一条
override init(frame: CGRect) {
self.isNeedUpdateLayout = true
super.init(frame: frame)
}
// 对应的是init(frame: CGRect, isNeedUpdateLayout: Bool)这个一级初始化方法
convenience init(isNeedUpdateLayout: Bool) {
self.init(frame: CGRect.zero, isNeedUpdateLayout: isNeedUpdateLayout)
}
// 对应的是override init(frame: CGRect)这个方法
convenience init() {
self.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// 测试用的容器
class Example {
init() {
let _ = BatMan(name: "老爷", age: "未知")
let _ = Robin(name: "老爷的继承人")
let _ = Robin(height: 170)
let _ = SuperMan()
let _ = SuperChild()
let _ = IronMan(name: "钢铁侠", age: "未知")
let _ = IronMan(name: "一首凉凉送给你", age: "未知", height: 180)
let _ = TestView()
let _ = TestView(isNeedUpdateLayout: true)
let _ = TestView(frame: .zero, isNeedUpdateLayout: true)
let _ = TestView(frame: .zero)
let _ = SpiderMan()
}
}
Swift的init方法总结
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 根据Swift的构造器生成规则: 如果自定义指定构造器,必须在自定义构造方法里调用父类的指定构造器; 如果自定义便...
- [Swift]Swift中的init方法 1.说明 Struct中的init的机制和class的基本类似,不同点我...
- 1.init方法的继承关系,以此类为基类为例 2.如果派生类中有未初始化的新的成员变量,则默认情况下不会从基类派生...
- 零,构造函数 1,一种特殊的函数2,主要用来在创建对象是,初始化对象3,给对象的成员变量设置初始值4,Swift支...