编译器相关
- plaground 后缀可以在xcode中预览结果,作为代码temp来看效果。
- swift 后缀为真正代码文件
- 语句末尾不强制要求’;’
关键字
- typealias 相当于 typedef
变量
- 变量声明没有赋值,需要指明类型。在变量名后用’: ‘类型指定
- 变量运算及赋值不会隐式类型转换。/(类型)等价string(类型)
- let 常量声明,可以不赋值,运行时赋值,但仅能赋值一次。
- var 变量声明,在类型后带?可以赋值nil
- Array [,…] 数组,空数组[类型]()
- Dictionary [key:value,…]() 字典, 空字典[kType:vType]()
- (name:type,…) 元组
- 函数作为数据类型,不在作为指针类型
- 0b、0o、0x, e十进制、p十六进制指数
流控制
- 条件不会隐式对比
- 条件可以有括号也可以没括号,语句体必须使用{}
- guard 拆包并判断条件不成立执行else
- if #available(iOS 8.0, *)判断sdk版本
- switch 可以比较任意类型,必须有default,无需break, case let x where…: fallthrough进入下一个case
- for (key_, value_) in dic, ..<范围
- while repeat代替do
- ?? 类似三目操作符:, 左为nil则返回右值
函数
- -> 指定返回值类型
- …可变参数在函数体内以数组形式存取
- inout 即使class实例是引用但也不能改,只能用inout
- {参数->返回值 in 函数体}匿名函数
- {参数名 in 函数体}参数和返回类型已知可省略,如函数参数
- 函数体只有一行代码,可以不写return
- 函数参数可以不命名而使用%0….
- 函数可以多态、可以模板
在函数名后T: where - defer 类似finish 在函数体结束后执行
闭包
- @noescape 闭包作为参数,不会逃匿出本函数去执行。
- @autoclosure 闭包参数,在闭包不含有参数时使用,可以让调用简单的提供一个表达式作为闭包,而不是使用{in表达式}。自动闭包含有noescape特性。
- @autoclosure(escaping)可逃逸自动闭包
- [捕获列表] 在参数前面 [weak self, unowned some](参数)->type
类
- class name:base,…. base不是必须的
- init 构造函数 convenience重载构造
- deint 析构函数
- override 重载函数
- set、get 为计算属性、有set必须有get newValue
- willSet、didSet 执行非计算属性的代码
- is 判断是否是某个类型的实例
- as 将实转换为某个类型的实例
- subscript 下标索引函数
- final 禁止重写继承
- convenience 便利构造器
- weak 弱引用 只能在可选属性
- unowned 无主引用 在非可选属性
- 隐式解析可选属性
- operators prefix infix postfix 操作符
- associativity left precedence right none 优先级
结构
- struct 与类唯一的区别就是以传值的形式传递
- mutating 会修改结构本身的函数
枚举
- enum:type 可以不指定type,则没有原始值,自身为原始值
- case 定义成员,用,分割成员,每行必case,成员可以是不同的类型
- rawValue
- hashValue
- indirect 可递归 enum my case number(int) case add(my, my)
- mutating 会修改枚举本身的方法
协议
- protocol name
- mutating 标记方法会改变属性,在struct中有必要,类中默认
- protocol<protocol1,protocol2,..>
扩展
- extention 只可以扩展方法、计算属性
模块
- module.modulemap module modulename [system] [extern_c] { header “path/name.h” [link “libname”] export * } module module name { explicit module name { header “path/name.h” [link “libname”] export * } explicit module name { header “path/name.h” [link “libname”] export * } }