自定义运算符不仅限于Ascii符号
1 | infix operator ❤ : MultiplicationPrecedence |
除了❤,类似☢、☂、☯等都可以用,而且这些符号都是可以组合起来的
空集合,是无法判断出有效类型的
1 | let arr = [Int]() |
可变参数,在函数内部就是数组
1 | func test(params: String...) { |
Optional类型,也是有map方法的
1 | let i: Int? = 10 |
有些场景下可以极大简化代码
闭包仅能推断出单表达式的返回值
1 | [1, 2, 3, 4].map { item in // Error: Unable to infer complex closure return type |
只有改成如下形式才能编译通过
1 | [1, 2, 3, 4].map { item in |
单表达式时,return关键字也可以省略
print是有更多参数可用的
1 | print("Hello", "World", separator: " ") // 输出Hello World,中间用空格分割 |
1 | // 下面两句输出: HelloWorld,不会换行 |
除此之外还有debugPrint,可能会输出更详细的信息
~= 可以很方便判断值是否在区间内
1 | let r = 1...5 ~= 3 |
switch判断,可以更强大
case后面跟可以不同类型,但需要重载 ~= 运算符
1 | struct Person { |
空元组,可以在不关心类型及数据时使用
1 | func emptyTuple(_: ()) { |
在Rx中,是有大量这样的使用,比如事件通知,不需要传数据,只要触发一下的情况,可能会用()
Swift中,Void也是用的空元组来定义的
1 | public typealias Void = () |
一起遍历两个Sequence时,可以用zip
1 | let lst1 = [1, 2, 3] |
元组是可以定义标签的
1 | var tuple: (first: Int, second: String, third: String?) = (0, "", nil) |
全局变量默认就是lazy的
1 | func globalFunc() -> Int { |
苹果源码仓库里有相应的测试代码,可以详细看到什么情况下会是懒加载:lazy_properties.swift
precondition,比assert更严格的检查
用法上与assert类似,但更严格,只有-Ounchecked选项才能关闭,但这样会很危险
1 | precondition(x >= 0) |
struct在没有自定义init时,系统会帮我们生成
1 | struct MySize { |
compactMap可以从列表中筛选出指定类型
1 | let arrs: [Any] = [1, 2, "3", "4", 5] |
从Dictionary获取值时,可以提供默认值
1 | let dict = ["1": 1] |
运算符也是方法
1 | let r = (+)(5, 6) |