以“#”开头关键字
字面量 | 类型 | 含义 |
---|---|---|
#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 不处理的时候就不会有警告了.
@discardableResult
public func titleLabelString(_ attributedString: NSAttributedString?) -> Self {
titleLabel.attributedText = attributedString
return 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: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = 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.5
matrix[1, 0] = 3.2
print("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 = Float
typealias Height = Float
func rectangularArea(width:Width, height:Height) -> Double {
return Double(width*height)
}
8. init
init关键字也表示构造器,初始化方法,在init后面加个”?”号, 表明该构造器可以允许失败。
class PerSon {
var name:String
init?(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 的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递。