Swift笔记(二)
基础部分
数据类型基于C和Objective-C的基础上提出,Int是整形,Double和Float是浮点型,Bool是布尔型,String是字符串。Swift还有两个集合类型Array和Dictionary
除了我们熟悉的类型,Swift 还增加了 Objective-C 中没有的类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。
Swift 还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示“那儿有一个值,并且它等于 x ”或者“那儿没有值”。可选有点像在 Objective-C 中使用nil,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的nil指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
Swift 是一个类型安全的语言,会阻止不正确的值传递。
常量和变量
常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。
1 | let a = 10 |
以在一行中声明多个常量或者多个变量,用逗号隔开:
1 | var x = 0.0, y = 0.0, z = 0.0 |
类型标注,在声明常量和变量的时候加上类型标注,说明变量或者常量要存储的类型。
1 | var str:String |
变量名不能包含数学符号,箭头,保留的关键字,Unicode码位,连线和制表符。不能以数字开头。
输出常量和变量
使用println函数来输出当前的变量或常量的值:
1 | println(myValue) |
使用\()语法可以将值转换成字符串类型
1 | println("I have a value -- \(myValue)") |
注释
与C语言相通,可以使用//,/*做单行、多行注释,也可以嵌套
1 | // 单行注释 |
分号
Swift 并不强制要求你在每条语句的结尾处使用分号(;),同一行内写多条独立的语句则必须加上分号
1 | let cat = "pop";println(cat) |
整数
整数可以是有符号的或者无符号的
如8位无符号整数的类型是UInt8,32位有符号的整数是Int32
整数范围
可以根据不同数据类型的min和max来获取对应的最大值和最小值
1 | let minValue = UInt8.min |
Int
长度默认与平台的原生字长相同
- 在32位平台上,
Int和Int32长度相同。 - 在64位平台上,
Int和Int64长度相同。
浮点数
Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。Float表示32位浮点数。精度要求不高的话可以使用此类型。
类型安全和类型推断
Swift 是一个类型安全(type safe)的语言。不匹配的类型会被标记为错误。
1 | let meaningOfLife = 42 |
数值型字面量
- 一个十进制数,没有前缀
- 一个二进制数,前缀是0b
- 一个八进制数,前缀是0o
- 一个十六进制数,前缀是0x
如果一个十进制数的指数为exp,那这个数相当于基数和10^exp的乘积:
- 1.25e2 表示 1.25 × 10^2,等于 125.0。
- 1.25e-2 表示 1.25 × 10^-2,等于 0.0125。
如果一个十六进制数的指数为exp,那这个数相当于基数和2^exp的乘积:
- 0xFp2 表示 15 × 2^2,等于 60.0。
- 0xFp-2 表示 15 × 2^-2,等于 3.75。
类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用typealias关键字来定义类型别名。
1 | typealias AudioSample = UInt16 |
元组
元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
1 | let http404Error = (400,"Not Found") |
元组分解
1 | let (statusCode,statusMessage) = http404Error |
也可以使用一部分元组,忽略的部分使用下划线(_)标记
1 | let (statusCode,_) = http404Error |
也可以实现下标访问单个元素
1 | let statusCode = http404Error.0 |
可以定于元组的时候给单个元素命名
1 | let http200Status = (statusCode:200,description:"OK") |
可选值(Optional)
使用可选值来处理值可能缺失的情况
1 | // 设置num是一个可选值,并赋值为3 |
if语句及强制解析
if语句可以判断一个可选值是否包含值,如果可选类型有值返回ture,没有值返回false
1 | // num为一个可选值 |
确定可选类型包含值后,可以再可选的名字后面加上感叹号(!)来获取值。
这个感叹号表示:我知道这个可选值有值,请使用它
1 | num!.toString() |
可选绑定
使用可选绑定来判断可选类型是否包含值,如果包含就把赋值给一个临时常量或者变量。
1 | if let temp = someOptional |
nil
可以给可选变量赋值为nil来表示它没有值
1 | var someOptinal:Int? = nil |
如果在声明可选变量或常量的时候没有赋值,默认设置为nil
隐式解析可选类型
改用感叹号来声明一个隐式解析可选类型,隐式可选类型就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都解析来获取值。
1 | let value : String! = "Hello" |
隐式解析可选类型主要被用作Swift中类的构造过程
隐式解析可选类型可以被当做普通可选类型来判断它是否有值
1 | if value { |
断言
断言用作出结束代码运行并通过调试来找到原因
使用断言进行调试
断言会在运行时判断一个逻辑条件是否为true,当条件为真,运行某段代码,条件为假,代码运行停止,应用被终止
例如使用全局assert函数来写一个断言,向assert函数传入一个结果为true或者false的表达式以及一条信息,当表达式为false的时候这条信息会被显示
1 | let age = -3 |
何时使用断言
当条件可能为假时使用断言,但是最终一定要保证条件为真,这样代码才能继续运行,断言的适用场景
- 整数类型的下标索引被传入一个自定义下标脚本实现,但是下标索引可能太小或者太大
- 需要给函数传入一个值,但是非法的值可能导致函数不能正常运行
- 一个可选值现在是nil,但是后续的代码运行时需要一个非
nil值
基本运算符
Swift支持大部分标准C语言的运算符,且改进许多特性来减少常规的编码错误,如:赋值符(=)不返回值,以防止把想要判断相等运算符(==)的地方写错导致赋值的错误。数值运算符(+,-,*,、,%)会检测并不允许值溢出。允许使用Swift的溢出运算符来实现溢出。
区别于C语言,在Swift中可以对浮点数进行取余运算(%),Swift还提供了表达两数之间的值的区间的运算符(a..b和a...b)表达一个区间的数值。
数值运算符
赋值表达用一个值来初始化或更新变量或常量
1 | let b = 10; |
但赋值不返回任何值
1 | if x = y { |
数值运算
- 加法(+)
- 减法(-)
- 乘法(*)
- 除法(/)
Swift默认不允许数值运算中出现溢出情况,但是可以使用溢出运算符来达到有目的的溢出(如a &+ b)
加法可以用于String的拼接
1 | "heloo" + " world" |
两个Character值或一个String和一个Character值,相加会生成一个新的String值
求余运算
1 | 9 % 4 // 等于1 |
浮点数求余计算
1 | 8 % 2.5 // 等于0.5 |
自增和自增运算
和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++)和自减(–)的运算符。其操作对象可以是整形和浮点型。
- 当++前置的时候,先自増再返回。
- 当++后置的时候,先返回再自增。
复合赋值(Compound Assignment Operators)
Swift也提供把其他运算符和赋值运算符组合的复合赋值运算符
1 | var a = 1 |
比较运算
- 等于(
==) - 不等于(
!=) - 大于(
>) - 小于(
<) - 大于等于(
>=) - 小于等于(
<=)
Swift还提供了恒等于===和恒不等于!==来比较两个对象是否饮用同一个对象的实例
三元条件运算(Ternary Conditional Operator)
问题 ? 答案1 : 答案2,如果问题成立,返回答案1的结果; 如果不成立,返回答案2的结果。
1 | let value = (boolValue ? 10 : 30) |
三元条件运算提供有效率且便捷的方式来表达二选一的选择。
区间运算符
闭区间运算符
a...b定义了一个包含从a到b所有值的区间,闭区间运算符在迭代一个区间的所有值时非常有用,比如for-in循环中:
1 | for index in 1...5{ |
半闭区间
a..b定义了一个从a到b但不包括b的区间。
1 | let names = ["Anna","Alex","Brian","Jack"] |
逻辑运算
- 逻辑非(!)
- 逻辑与(&&)
- 逻辑或(||)

