【我们都爱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.
783 0
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
867 0
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1050 0
|
iOS开发 存储 缓存
iOS的init、loadView、 viewDidLoad、viewDidUnload的关系
iOS的init、loadView、 viewDidLoad、viewDidUnload的关系 发布于:2012-11-20 10:56阅读数:5320 在init方法中实例化必要的对象(遵从LazyLoad思想)。
917 0
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
15天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
3天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
18 7
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
12天前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
31 6
|
12天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
28 4