一、关键词
guard 使用场景
使用 guard 来表达 “提前退出”的意图,有以下 使用场景 :
在验证入口条件时
在成功路径上提前退出
在可选值解包时(拍扁 if let..else 金字塔)
return 和 throw 中
日志、崩溃和断言中
fileprivate
- 当前文件都可以使用
- 比如说在函数前面加上这个关键字,当前文件都可以调用这个函数
private:
filter: 条件满足
- 用于选择数组元素中满足某种条件的元素
intArray = [1, 3, 5]
let filterArr = intArray.filter {
// $0表示第一个参数、一次类推
return $0 > 2
}
// [3, 5]
map: 转换
- map 是Array类的一个方法,我们可以使用它来对数组的每个元素进行转换
let intArray = [1, 3, 5]
let stringArr = intArray.map {
return "($0)"
}
// ["1", "3", "5"]
reduce: 计算
- 把数组元素组合计算为一个值
let intArray = [1, 3, 5]
let result = intArray.reduce(0) {
return $0 + $1
}
//9
final:
二、协议代理
- 为了避免循环引用, 代理用 weak 修饰, 但是weak 修饰会报错, 因为 weak 只修饰class, 所以协议需要继承自 class
- struct enum 都可以遵守协议
三、函数
func makecoffee(type :String = "卡布奇诺") -> String {
return "制作一杯\(type)咖啡。"
}
let coffee1 = makecoffee("拿铁")
let coffee2 = makecoffee()
func sum(numbers:Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total
}
sum(100.0, 20, 30)
sum(30, 80)
默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址
必须是变量,因为需要在内部改变其值
Swift提供的inout关键字就可以实现
// 函数二:指针的传递
func swap1(inout a : Int, inout b : Int) {
let temp = a
a = b
b = temp
print("a:\(a), b:\(b)")
}
swap1(&a, b: &b)
print("a:\(a), b:\(b)")
- 构造函数
- 在自定义构造函数调用super.init之前,必须保证所有的属性被初始化,否则报 Property self.titles not initialized... 错误
Extension
- 在 extension 扩充构造函数,必须扩充便利构造函数
- 必须在 init 前,加上convenience
- 必须调用 self.init() 原有的某一个构造函数
convenience init() {
self.init()
}
闭包
- @escaping : 闭包在另外一个闭包内使用需要用这个关键字
十、其它
class 和 struct 的区别
-
相同点: 我们可以使用完全使用相同的语法规则来为 class 和 struct 定义属性、方法、下标操作、构造器,也可以通过extension 和 protocol 来提供某种功能。
-
不同点:
- 与 struct 相比,class 还有如下功能:1、继承允许一个类继承另一个类的特性。2、类型转换允许在运行时检查和解释一个类实例的类型。3、引用计数允许对一个类的多次引用。4、析构器允许一个类实例释放任何其所被分配的资源。
- 在 swift 中 struct 是值,而 class 是引用。所谓值,struct 一旦生成是不能变的,如果有一个方法改变了自己的属性,这个方法需要标为 mutating,修改时会产生一个新值去替代旧值(这一步可能会被编译器优化,并不一定会真的产生一个新 struct)。而 class 无论怎么传递都是同一个对象。
try? 和 try!是什么意思
- try?: 表示忽略异常,如果后面的表达式有异常抛出,会忽略,并且返回 nil。
- try!: 断言这里不会抛异常。如果后面表达式有异常抛出,直接崩溃。
public 和 open 的区别
- 像构造函数等,只能用 public 不能用 open。enum、protocol 的声明也只能用 public。
网友评论