【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记6 init

简介: 这一话首先来讲写关于init的东西。首先初始化并不会经常被用到,这是因为类和结构体中的大部分属性都会通过赋值被初始化,或者有些属性是Optional的,这样即使是nil也没关系,可以在之...

这一话首先来讲写关于init的东西。


首先初始化并不会经常被用到,这是因为类和结构体中的大部分属性都会通过赋值被初始化,或者有些属性是Optional的,这样即使是nil也没关系,可以在之后再给它们赋值,就好比StoryBoard中的outlet,又或者可以使用闭包来初始化,或者使用lazy来避开init,所以有很多方法来避免init,除非你确实需要一个init的时候,那么该怎么做呢?

在一些情况下会自动生成init,其中一种情况是当类中的所有属性都有初始值的时候,你会自动得到一个没有参数的初始化方法。结构体的话它会默认得到一种将所有属性作为参数的初始化方法,仅当结构体中没有初始化方法的时候,如示例中可以通过圆括号中的赋值来初始化一个MyStruct结构体。


那么初始化方法可以做什么呢。首先我们可以在初始化方法中重置默认值,比如默认值是3,而初始化方法中把它赋值为4,那么它的值就会变成4。甚至如果你的属性是一个let定义的常量,依旧可以在init方法中为它赋值。在你的类和结构体中你可以调用其他的初始化方法,使用self.init,这样你可以调用有不同参数的其他初始化方法。当然在类中你可以调用super.init,当然调用父类的init方法时有很多规则。


那么在init的时候有什么是你必须要做的么?首先在任何的init方法完成时你必须保证所有的属性都被初始化了,注意如果有一个Optional它的值是nil,也算它有值。

在类中Swift提供两种方法来初始化,注意不是在结构体中而是在类中,一种是Convenience Initializer,其他的都是另外一种init,叫做Designated Initializers,Designated Initializers是默认的初始化方法。一个Designated Initializer只能调用它父类中的Designated Initializer,这是一个非常重要的规则,如果有一个Designated Initializer,它的前面没有convenience这个单词,必须在init中调用父类的init而不能调用自身的其他init,并且父类中的init也必须是Designated类型的。

另外,你必须在调用父类的初始化方法时,首先初始化你自己的所有属性!

你必须先让父类给它的属性赋值然后你才能给它们赋值!

Convenience Initializer有不同的特性,它必须而且只能调用本类中的designated initializer ,它不能调用任何父类的初始化方法,它可以通过其他Convenience Initializer来间接调用designated initializer。

Convenience Initializer必须直接或者间接调用designated initializer之后才能访问其他值。

最后,调用类中的方法和属性必须在初始化完成之后才能进行。

下面来聊聊继承式初始化


如果你没有在你的类中实现任何designated initializer,那么你将继承你父类中的所有designated initializers,否则你将不继承你父类中的任何designated initializer。

如果你重写了所有的designated initializer,那么你将继承父类中所有的Convenience Initializer。

如果你在初始化方法前加上required关键字的话,这个类的子类就必须实现它的这个初始化方法。


那么failable init呢?有一些初始化方法允许失败并且返回nil,它的定义中init后面跟着一个?,看了之前的几话大家对?应该是很熟悉了,示例中展示了一个UIImage,它可以通过图片名称从项目中获得一个图片,当然如果项目中没有这个图片的话,它就会返回nil。通常面对这种failable init,我们使用if let结构,如果初始化成功我们就执行动作,否则就做其他工作。在Swift中我们很少使用java中常用的try和catch,可选型的出现让try-catch变得不是必须的。


讲了这么多关于初始化的知识,那么该如何新建一个对象呢?做法是在想要创建的对象名称后面加一对圆括号,括号内是初始化方法的参数。但是并不是一直使用这种方法,有时候你会使用一个类方法或者类型方法去创建。如示例中所示,我们创建一个按钮的时候使用了UIButton这种类型的一个方法。

还有一种比较少用的初始化方法,有些时候你的一些对象会帮助你创建另一些对象,例如String中有一个非常酷的方法叫做join,join接受一个有字符串组成的数组并且用join的方式隔开,所以上面的示例会返回给你一个由“,”隔开的字符串,把myArray分割成两部分,这明显是创建了一个新的数组。


目录
相关文章
|
前端开发 API
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记4 MVC enum Tuple Dictionary
 回顾一下我们上一话中的代码: @IBAction func operate(sender: UIButton) { let operation = sender.
771 0
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
844 0
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1021 0
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
88 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
39 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2
|
3月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
48 1
|
3月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
54 1
|
9天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0