SwiftGG 文档翻译笔记 1- 基础部分函数闭包
Swift基础部分
基础类型
基础数据类型
Int, Float, Double
Bool
String
基本集合类型
Array
Set
Dictionary
元组 Tuple
示例:
Notice:元组适合封装简单数据,复杂的数据类型应该考虑使用类或结构体
可选类型 Optional
可选类型是一种独立的类型,用?
修饰的变量,与普通变量是不一样的,要获取可选变量的值,必须对其进行解析或强制解析
代码示例
Notice!在Swift中,nil 只是表示无值的一种状态,不是指针或一种数据类型,nil 只能赋值给 可选类型。
这里一定要注意与OC的区别,OC的nil是指针,表示为空,数据类型表示为空的有 NSNotFound。所以抽象出来,语言里需要一种表示无值的一种状态。在Swift里,直接抽象为 可选类型 Optional,这里要调整下思维。用无值 或 有值 这两种状态,来表示以前OC里的是否为空的概念。
nil
nil只能用于可选类型变量,不能直接赋给常量或变量
强制解析
确定可选变量一定有值,则可以对其进行强制解析,获取对应值,否则报错
基本格式
可选绑定
可选绑定用于 if, while语句中,如果someOptional有值则解析后赋给变量,无值则为nil
隐式解析可选类型
如果确定一个可选类型是有值的,则可以把 ?
修改 成!
,使用时不用再对其进行解析。
注:一个隐式解析可选类型其实就是一个普通的可选类型,默认值为 nil,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。
类型别名
关键字:typealias
错误处理
断言
先决条件
注,断言在Debug状态有效,生产环境无效;先决条件在生产环境也有效。但在Xcode设置里,会有点不一样
- In -O builds (the default for Xcode's Release configuration): if
condition
evaluates to false, stop program execution.- In -Ounchecked builds,
condition
is not evaluated, but the optimizer may assume that it would evaluate totrue
. Failure to satisfy that assumption in -Ounchecked builds is a serious programming error.
运算符
空合运算符
示例:
区间运算符(Range Operators)
闭区间运算符,
a...b
半开区间运算符,
a..<b
单侧区间,
[2...]
、[...2]
恒等运算符与相等运算符
恒等运算符
恒等,
===
不恒等,
!==
相等运算符
相等,
==
不相等,
!=
关于恒等与相等
恒等,只对类的实例对象,用恒等判断两个实例对象是否是同一个,类似OC里指针判断(但Swift变量并不是指针,另外,结构和枚举都是值类型,不存在恒等概念,变量赋值就会发生值拷贝)。
相等,Swift结构都可判断两个变量是否相等,前提是必须遵守 Equatable
协议。实现该协议后,即可用相等运算符(==)进行判断。大部分Swfit基本结构都已实现该协议。
关于Equatable
、Hashable
、Comparable
三个协议后面详写
字符串与字符
字符串,String
字符,Character
集合类型
数组,
Array<Element>
集合,
Set<Element>
字典,
Dictionary<Key, Value>
控制流
for语句
while语句
if...else语句
switch...case语句
for语句
关键字:for
, stride
while
关键字:repeat
switch...case
关键字:fallthrough
不需要break语句,单条执行完结束(需要类似C语言的Case贯穿效果,可以使用 fallthrough)
case 语言,可以包含多参数、区间、元祖匹配;每条case语句必须有实现体,否则报错;
```swift
case "a", "A": //集合过多时,也可以直接换行
case 1..<5:
//元组
case (0, 0):
case (, 0): //使用下划线()来匹配所有可能的值
case (let x, 0): //这种情况下,相当于 (_, 0)
//新增 where
case let (x, y) where x == y:
```
guard-else
语法要求
guard必须带else
else语句内必须使用return、break、continue 或者 throw 做这件事,或者调用一个不返回的方法或函数,例如 fatalError()。
作用:与 if-else效果相同,但是可以更突出代码含义
参考: 使用 guard 的正确姿势
检测 API 可用性
函数
Swift的函数非常强大,非常灵活。写法样式是参考 JS函数的定义形式。通过函数类型,其实函数可以作为一种与String相同的数据类型使用,可以作为参数、入参等等。
Swift的函数是可嵌套的,即函数内还可定义函数。
函数是引用类型,即类似OC中指针概念,将一个函数变量赋值给另一个变量,不会发生拷贝,两个变量指向同一个函数。
函数定义
可变参数
通过...来定义可变参数,一个函数内只能有一个可变参数,可变参数即为对应参数的数组形式
输入输出参数
关键字:inout
,&
概念与OC里的输入输出差不多,函数内对inout参数进行引用
闭包
闭包可以用OC里的Block来理解。
注意一点,闭包是值引用,与函数一样,赋值不会造成拷贝。
文档有以下几点说明:
在 [函数]() 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采用如下三种形式之一:
>
- 全局函数是一个有名字但不会捕获任何值的闭包
- 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
- 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
>
Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
>
- 利用上下文推断参数和返回值类型
- 隐式返回单表达式闭包,即单表达式闭包可以省略
return
关键字- 参数名称缩写
- 尾随闭包语法
表达式
闭包的循环强引用
关键词:weak
、unowned
weak
,弱引用,类型必须是Optional,释放后会被置为nilunowned
,无主引用,用于不会变成 nil的变量
循环强引用,在Swift中的解决方案是:捕获列表。
尾随闭包
函数参数最后一个为闭包时,可用尾随闭包的形式,写起来更简单明了
逃逸闭包
关键字:@escaping
当闭包作为参数传递到函数内,如果函数内没有明确调用该闭包,比如不调用,则该闭包必须声明为逃逸闭包,否则编译会报错。调用标记为 @escaping的闭包时,如果有用到self内容时,必须显式使用 self
自动闭包
关键字:@autoclosure
使用 @autoclosure 关键字声明后,会自动把语句转化为闭包,省去花括号。自动闭包核心就是为省去花括号。
版权声明: 本文为 InfoQ 作者【落】的原创文章。
原文链接:【http://xie.infoq.cn/article/e35ebb04fde1ab27a2158185b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论