以“#”开头关键字
| 字面量 | 类型 | 含义 |
|---|---|---|
| #file | String | 所在的文件 |
| #function | String | 所在的方法 |
| #line | Int | 所在的行 |
| #column | Int | 所在的列 |
| #if | * | * |
| #else#elseif | * | * |
| #endif | * | * |
| #available | * | * |
| #selector | * | * |
声明关键字
| 字面量 | 类型 | 含义 |
|---|---|---|
| import | 引用 | 引入框架 |
| class | 声明 | 声明一个类和声明类方法 |
| struct | 声明 | 结构体 |
| enum | 声明 | 枚举 |
| protocol | 声明 | 协议 |
| extension | 声明 | 扩展 |
| func | 声明 | 方法 |
| let | 声明 | 一个不可变的常量 |
| var | 声明 | 一个可变的变量 |
| init | 构造 | 构造函数 |
| deinit | 构造 | 解构函数 |
| static | 修饰 | 静态修饰 |
| typealias | 修饰 | 别名修饰 |
| subscript | 修饰 | 下标 |
| override | 修饰 | 子类重写父类变量或方法 |
| mutating | 修饰 | 方法前添加,修饰可变对象,可变即可修改 |
| private | 访问级别 | 只在当前类中调用 ,不能在extension中调用 |
| fileprivate | 访问级别 | 限于当前文件下或当前文件下当前类调用 |
| Internal | 访问级别 | 默认访问级别 |
| public | 访问级别 | 公开访问不能被子类重写 |
| open | 访问级别 | 公开访问可以被子类重写 |
| final | 访问级别 | 在class、func和var前修饰,表示不可重写 |
与语句有关的关键字
| 字面量 | 类型 | 含义 |
|---|---|---|
| break | * | * |
| case | * | * |
| continue | * | * |
| default | * | * |
| do | * | * |
| else | * | * |
| fallthrough | * | * |
| if | * | * |
| in | * | * |
| for | * | * |
| return | * | * |
| switch | * | * |
| where | * | * |
| while | * | * |
表达式和类型关键字
| 字面量 | 类型 | 含义 |
|---|---|---|
| as | * | 强转 |
| dynamicType | * | 获取对象动态类型 |
| is | * | 类型判断 |
| new | * | * |
| super | * | * |
| self | * | * |
| Self | * | * |
| Type | * | * |
在特定上下文中使用的关键字
| 字面量 | 类型 | 含义 |
|---|---|---|
| associativity | * | * |
| didSet | * | * |
| get | * | * |
| infix | * | * |
| inout | * | * |
| left | * | * |
| mutating | * | * |
| none | * | * |
| nonmutating | * | * |
| operator | * | * |
| override | * | * |
| postfix | * | * |
| precedence | * | * |
| prefix | * | * |
| rightset | * | * |
| unowned | * | * |
| unowned(safe) | * | * |
| unowned(unsafe) | * | * |
| weak | * | * |
| willSet | * | * |
其他关键字
1. if let
swift里面有optional可选类型情况,也叫封包处理
可以通过 if let进行解包 判断非空的情况才把值取出来
if let customView = customView1 {customView.removeFromSuperview()}// 如果customView1 为空,判断直接跳过,往下执行. 如果customView1 不为空,执行{}中的语句.
2. @discardableResult
去除警告
swift正常的方法如果有返回值的话,调用的时候必须有一个接收方,否则的话编译器会报一个警告,如果在方法前加上 @discardableResult 不处理的时候就不会有警告了.
@discardableResultpublic func titleLabelString(_ attributedString: NSAttributedString?) -> Self {titleLabel.attributedText = attributedStringreturn self}
3. final
final关键字可以在class、func、var前修饰,表示不可重写,可以把类或者类中的部分实现保护起来,从而避免子类破坏。
class Person : NSObject {//修饰词 final 表示 不可重写 可以将类或者类中的部分实现保护起来,从而避免子类破坏final func language(){//something price code here//...}}class Student: Person {// 此处重写`final`修饰的language方法,报错 “Instance method overrides a 'final' instance method”// override func language(){//// }}
4. override
重写方法
如果我们要重写某个方法, 或者某个属性的话, 我们需要在重写的变量前增加一个override关键字。我们看下系统的继承方法
override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.}
5. subscript
下标
subscript关键字表示下标,可以让class、struct、以及enum使用下标访问内部的值。其实就可以快捷方式的设置或者获取对应的属性, 而不需要调用对应的方法去获取或者存储, 比如官网的一个实例:
struct Matrix {let rows: Int, columns: Intvar grid: [Double]init(rows: Int, columns: Int) {self.rows = rowsself.columns = columnsgrid = Array(repeating: 0.0, count: rows * columns)}func indexIsValid(row: Int, column: Int) -> Bool {return row >= 0 && row < rows && column >= 0 && column < columns}//实现`subscript`方法subscript(row: Int, column: Int) -> Double {get {assert(indexIsValid(row: row, column: column), "Index out of range")return grid[(row * columns) + column]}set {assert(indexIsValid(row: row, column: column), "Index out of range")grid[(row * columns) + column] = newValue}}}func matrixTest(){var matrix = Matrix(rows: 2, columns: 2)matrix[0, 1] = 1.5matrix[1, 0] = 3.2print("matrix == \(matrix)")/**打印结果:matrix == Matrix(rows: 2, columns: 2, grid: [0.0, 1.5, 3.2, 0.0])*/}
6. mutating
mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。
public mutating func fetchSetingsList(index: Int) -> [MyViewSetingInfo] {let dataSoure: [[MyViewSetingInfo]] = [accountList,setingsList,messageList]guard index < dataSoure.count else { return [MyViewSetingInfo(title: "错误", subTitle: "错误", className: "")]}return dataSoure[index]}
7. typealias
使用关键字typealias定义类型别名(typealias就相当于objective-c中的typedef),就是将类型重命名,看起来更加语义化。说人话就是:起别名。
typealias Width = Floattypealias Height = Floatfunc rectangularArea(width:Width, height:Height) -> Double {return Double(width*height)}
8. init
init关键字也表示构造器,初始化方法,在init后面加个”?”号, 表明该构造器可以允许失败。
class PerSon {var name:Stringinit?(name : String) {if name.isEmpty { return nil }self.name = name}}
9. required
required是用来修饰init方法的,说明该构造方法是必须实现的。
class Father: NSObject {var name: String?required init(name: String) {self.name = name}}class Son: Father {required init(name: String) {super.init(name: name)self.name = name}}
从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override。
使用required的注意点:
- required修饰符只能用于修饰类初始化方法。
- 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
- 当子类没有初始化方法时,可以不用实现父类的required初始化方法。
10. convenience
使用convenience修饰的构造函数叫做便利构造函数 。便利构造函数通常用在对系统的类进行构造函数的扩充时使用。
便利构造函数的特点如下:
- 便利构造函数通常都是写在extension里面
- 便利函数init前面需要加载convenience
- 在便利构造函数中需要明确的调用self.init()
11. deinit
deinit属于析构函数,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。和OC中的dealloc 一样的。
我们通常在deinit函数中进行一些资源释放和通知移除等。
列举如下:
在swift中,fallthrough的作用是就是在switch-case中执行完当前case,继续执行下面的case.
13. 访问权限关键字
private:
fileprivate:
internal:
public:
open:
可以在多个targets中调用. 并且可以重写方法
14 . @state
struct ContentView : View {@State private var brain: CalculatorBrain = .left("0")var body: some View {// ...}}
@state 修饰的值,在SwiftUI 内部会被自动转换为一对setter 和getter,对这个属性进行赋值的操作将会触发View 的刷新,它的body 会被再次调用,底层渲染引擎会找出界面上被改变的部分,根据新的属性值计算出新
的View,并进行刷新。
@State 属性值仅只能在属性本身被设置时会触发UI 刷新,这个特性让它非常适合用来声明一个值类型的值
对于@State 修饰的属性的访问,只能发生在body 或者body 所调用的方法中。你不能在外部改变@State 的值,它的所有相关操作和状态改变都应该是和当前View 挂钩的
15. @Binding
和@State 类似,@Binding 也是对属性的修饰,它做的事情是将值语义的属性“转换” 为引用语义。对被声明为@Binding 的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递。

