[TOC]
入门
- 一、基础部分
- 二、基本运算符
OC与Swift混编
原本在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另外一种方式:继承 NSObject。
即class 继承了 NSObject 后,编译器就会默认给这个类中的所有函数都标记为 @objc ,支持 OC 调用。
然而在实际项目中,一个 swift 类虽然继承了 NSObject,但是其中还是有很多函数不会在 OC 中被调用,这里有很大的优化空间。
于是根据 SE160 的建议,苹果修改了自动添加 @objc 的逻辑:现在一个继承 NSObject 的 swift 类不再默认给所有函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。
XCode 9会在运行过程中自行检测类中函数是被 OC 调用,然后提示添加 @objc。下图中的 vc 是 swift 中的类,showStatus 也是 swift 函数,现在编译器会提示需要手动添加 @objc:
Swift概念新增/区别
swift的guard语句的时候,我当时不太理解以后会有什么理由能用到它。这个语句的介绍如下:
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
- Swift中函数的默认值和传参省略:有默认值才可以省略参数
一、基础部分
Swift基础部门:http://www.swift51.com/swift4.0/chapter2/01_The_Basics.html
1、声明常量和变量
声明变量时在类型后添加?或者!,就是告诉编译器这是一个Optional的变量,如果没有初始化,你就将其初始化为nil
常量和变量必须在使用前声明,用 let
来声明常量,用 var
来声明变量。
1 | let maximumNumberOfLoginAttempts = 10 |
与变量不同,常量的值一旦被确定就不能更改了。尝试这样做会导致编译时报错:
1 | let languageName = "Swift" |
附:类型标注
Swift可以根据赋值推断出类型。
1 | let PI = 3.1415 |
你也可以使用类型标注(type annotation)来指定类型。在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。声明中的冒号代表着“是…类型”
1 | var welcomeMessage: String = "string" |
2、输出print
Swift使用字符串插值(string interpolation)的方式将常量或变量当作占位符加入到长字符串中,我们可以借此拼接长字符。
1 | let value1 = "123" |
3、数据类型(布尔值、数组、字典、元组、可选类型)
3.1、布尔值
和OC不同,Swift中的布尔值使用true
和false
表示真、假
1 | let boolValue = true |
这里需要说明的是,Swift不能像OC中那样,数值为0即表示布尔值NO
,非0即为YES
,因此下面OC代码可以通过
1 | float value = 0.001; |
而在Swift中会编译报错
1 | let boolValue = 0.001 |
3.2、可选类型
3.2.1、可选类型
使用可选类型(optionals)来处理值可能缺失的情况。
1 | let possibleNumber = "123" |
因为该构造器可能会失败,所以它返回一个可选类型(optional)Int
,而不是一个 Int
。一个可选的 Int
被写作 Int?
而不是 Int
。问号暗示包含的值是可选类型,也就是说可能包含 Int
值也可能不包含值。(不能包含其他任何值比如 Bool
值或者 String
值。只能是 Int
或者什么都没有。)
3.2.2、隐式解析可选类型
可选类型 String
和隐式解析可选类型 String
之间的区别:
1 | let possibleString: String? = "An optional string." |
你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。
nil
Swift 的 nil
和 Objective-C 中的 nil
并不一样。
Objective-C | Swift | |
---|---|---|
nil | 在 Objective-C 中,nil 是一个指向不存在对象的指针。只有对象类型能被设置为 nil 。 |
在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil ,不只是对象类型。 |
你可以给可选变量赋值为nil
来表示它没有值:
1 | var serverResponseCode: Int? = 404 |
强制解析
1 | //let possibleNumber = "123" |
可选绑定
在 if
语句中写一个可选绑定:
1 | if let constantName = someOptional { |
举例:
1 | if let actualNumber = Int(possibleNumber) { |
这段代码可以被理解为:“如果 Int(possibleNumber)
返回的可选 Int
包含一个值,创建一个叫做 actualNumber
的新常量并将可选包含的值赋给它。”
二、基本运算符
1、赋值运算符
与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以以下代码是错误的:
1 | if x = y { |
这个特性使你无法把(==
)错写成(=
),由于 if x = y
是错误代码,Swift 能帮你避免此类错误发生。
如果赋值的右边是一个多元组,它的元素可以马上被分解成多个常量或变量:
1 | let (x, y) = (1, 2) |
2、算术运算符
加法运算符也可用于 String
的拼接:
1 | "hello, " + "world" // 等于 "hello, world" |
在新版Swift中,++ 和 – 运算符被取消,因此 i++ 这种形式的累加需要换成 i += 1 这种形式。
3、一元正号/负号运算符
1 | let tempValue = -6 |
4、比较运算符(Comparison Operators)
比较运算多用于条件语句,如if
条件:
1 | let name = "world" |
5、空合运算符(Nil Coalescing Operator)
空合运算符(a ?? b
)将对可选类型 a
进行空判断,如果 a
包含一个值就进行解封,否则就返回一个默认值 b
。表达式 a
必须是 Optional 类型。默认值 b
的类型必须要和 a
存储值的类型保持一致。
1 | a ?? b // 空合运算符 |
注意: 如果
a
为非空值(non-nil
),那么值b
将不会被计算。这也就是所谓的短路求值。
6、区间运算符(Range Operators)
写法 | 示例 | |
---|---|---|
闭区间运算符 | a…b | for index in 1…5 {} |
闭区间运算符的单侧形式 | [a…]或[…b] | for name in names[2…] { print(name) } |
半开区间运算符 | a..<b | for i in 0..<count {} |
半开区间运算符的单侧形式 | [..<b] |
7、逻辑运算符(Logical Operators)
注意: Swift 逻辑操作符
&&
和||
是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。为使得代码更加可读,建议使用括号来明确优先级
1 | if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { |
8、溢出运算符
1 | var maxInt = Int8.max // Int8 型整数能容纳的最大值是 +127,以二进制表示即 01111111。 |
三、函数
Swift的函数使用 func
声明一个函数,形式为:
1 | func name(parameters) -> return type { |
常用的函数形式
1 | // 无参数函数 |
1 | // 可选返回类型,‘_’ 表示忽略参数标签 |