学习Swift -- 构造器(上)
构造器(上)
构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务。
构造过程是通过定义构造器(Initializers
)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法。与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。
类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。
你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值。以下章节将详细介绍这两种方法。
注意:当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器。
init() {
// 这是最简单的构造器也是默认构造器 在这个构造器中什么事情都没有做,但是一般会在这里面写一些构造过程
}
struct Fahrenheit {
var temperature: Double // 这里没有给定初始值
init() {
// temperature是存储属性 在初始化这个实例时必须给定初始值 初始值可以在构造过程中设置
temperature = 32.0
}
} // 调用了Fahrenheit的构造器 temperature在构造过程中被设置了
let fahrenheit = Fahrenheit()
print(fahrenheit.temperature)
// 打印出: 32.0
自定义构造过程
在实际开发中我们经常会自定义构造过程,我们可以为自定义构造器提供参数,为其提供自定义构造所需值的类型和名字。
struct Celsius {
var temperatureInCelsius: Double = 0.0
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
} init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
// 以上声明了两种构造器,可以根据情况选择任何一种来创建新的实例
} let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
print(boilingPointOfWater.temperatureInCelsius)
// 打印出 100.0 let freezingPointOfWater = Celsius(fromKelvin: 273.15)
print(freezingPointOfWater.temperatureInCelsius)
// 打印出 0.0
注意:如果声明构造器没有指定外部参数名,Swift会生成一个跟内部参数名一样的外部参数名,用以区别不同的构造器
struct Color {
var red: Double
var yellow: Double
var blue: Double init(red: Double, yellow: Double, blue: Double){
self.red = red
self.yellow = yellow
self.blue = blue
} init(white: Double){
red = white
yellow = white
blue = white
} // 如果你不想指定外部参数名,可以用"_"
init(_ black: Double){
red = black
yellow = black
blue = black
}
} // 在自定义构造器中并没有指定外部参数名,但是Swift还是默认为我们生成了外部参数名
let redColor = Color(red: 1.0, yellow: 0.0, blue: 0.0)
let whiteColor = Color(white: 1.0) // 不指定外部参数名 "init(_ black: Double)"
let blackColor = Color(0.0)
可选属性类型
如果你定制的类型包含一个逻辑上允许取值为空的存储型属性--不管是因为它无法在初始化时赋值,还是因为它可以在之后某个时间点可以赋值为空--你都需要将它定义为可选类型。可选类型的属性将自动初始化为空nil
,表示这个属性是故意在初始化时设置为空的。
class SurveyQuestion{
var text: String
var response: String?
init(text: String){
self.text = text
// response是可空类型,所以就算没有指定默认值 构造过程中也没有设置它的值也不会报错,但是它会默认设置为空(nil)
}
}
构造过程中设置常量属性
只要在构造过程结束前常量的值能确定,你可以在构造过程中的任意时间点修改常量属性的值。
注意:对某个类实例来说,它的常量属性只能在定义它的类的构造过程中修改;不能在子类中修改。
class SurveyQuestion{
let text: String
var response: String?
init(text: String){
// text是常量 只要text在声明时没有指定默认值,那么在构造过程中可以有一次机会来设置它的值
self.text = text
}
}
结构体的逐一构造器
如果结构体对所有存储型属性提供了默认值且自身没有提供定制的构造器,它们能自动获得一个逐一成员构造器。
struct Size {
var width = 0.0
var height = 0.0
} // 逐一构造器
let size = Size(width: 11.0, height: 5.0)
学习Swift -- 构造器(上)的更多相关文章
- 学习Swift -- 协议(上)
协议(上) 协议是Swift非常重要的部分,协议规定了用来实现某一特定工作或者功能所必需的方法和属性.类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能够满足协议要求 ...
- 学习Swift -- 构造器(中)
构造器(中) 值类型的构造器代理 构造器可以通过调用其它构造器来完成实例的部分构造过程.这一过程称为构造器代理,它能减少多个构造器间的代码重复. 构造器代理的实现规则和形式在值类型和类类型中有所不同. ...
- 学习Swift -- 构造器(下)
构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某 ...
- ios -- 教你如何轻松学习Swift语法(三) 完结篇
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.自动引用计数 1.自动引用计数工作机制 1.1 swift和o ...
- ios -- 教你如何轻松学习Swift语法(一)
目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...
- 一步一步学习Swift之(一):关于swift与开发环境配置
一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...
- 学习swift语言的快速入门教程推荐
随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...
- 開始学习swift,资料汇总帖
最近開始学习swift,以后mac和ios开发就指望它,曾经学oc半途而废了.主要原因是oc等语法实在能适应,如今有swift了.语法有js,scala,python,c++,oc等语言的影子,又一次 ...
- ios -- 教你如何轻松学习Swift语法(二)
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.可选类型(重点内容) 1.什么是可选类型? 1.1在OC开 ...
随机推荐
- 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm
BrowserSwarm是一个免费工具,能够自动化跨平台测试JavaScript.
- 知名IT企业待遇一览表
115家IT公司待遇一览表 作者是西电通院2013届毕业硕士,依据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇例如以下,吐血奉献,公司比較全.下面绝对是各大公司2013届校招的数 ...
- Hadoop-2.4.1学习之Map任务源代码分析(下)
在Map任务源码分析(上)中,对MAP阶段的代码进行了学习,这篇文章文章将学习Map任务的SORT阶段.假设Reducer的数量不为0.则还须要进行SORT阶段.但从上面的学习中并未发现与MAP阶段运 ...
- hibernate.hbm.xml配置文件内容说明
下面是一个自动生成的配置文件: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PU ...
- LabVIEW设计模式系列——事件结构中值改变事件
标准:1.将具有值改变事件的控件,放置在其事件结构的值改变页面里.
- spring 3.1.4 升 4.0.2
来自为知笔记(Wiz)
- Linux下载jdk ,Linux如何下载jdk
Linux下载jdk Linux如何下载jdk >>>>>>>>>>>>>>>>>>> ...
- CSS权威指南-第三版--读书笔记
第一章:CSS和文档 html是结构化语言,css是样式语言,html主要用来被强大的搜索引擎更好的索引,更好的让一个盲人通过语音浏览器来了解我们的网页,这也就是为什么说html是结构话语言,因为这是 ...
- [原创]ie6,7中td和img之间有间隙
情形描述 开发工具:VS2010: 浏览器版本:IE6以上,火狐,谷歌: 页面布局设计:Table+Img布局: 项目预览问题:火狐,谷歌,IE8以上未出现问题,IE6,IE7图片之间有间隙. 分析原 ...
- word每次打开都要选择文档类型
每次打开word07 都出现下面一个框框,说要转换文件. 在Word2013文档中,为了能更好地使用“从任意文件还原文本”功能,用户需要启用“打开时确认文件格式转换”功能,以在打开并恢复文件时出现文件 ...