Fork me on GitHub

以撸代码的形式学习Swift-1:基础(The Basics)

1 常量和变量(Constants and Variables)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 声明:常量 let 变量 var
let constants = 10
var variables = 0
// 多个声明
var x = 0.0, y = 0.0, z = 0.0
// 类型标注(type annotation)
var welcomeMessage: String
// 常量和变量的命名
// 常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头。
// 常量与变量不能修改类型也不能互换
// 使用反引号(`)来使用保留关键字
let π = 3.14159
let 你好 = "你好世界"
let `let` = "hihi"
// 输出常量和变量 `func print(_ items: Any..., separator: String = default, terminator: String = default)` 三种参数:输出项、分隔符、结束符
print(1,`let`, separator: ",", terminator: "<br/>")
print(x, y, z, `let`)
// 字符串插值(string interpolation)
print("The current value of constants is \(constants)")

2 注释(Comment)

1
2
3
4
5
6
// 单行注释
/*
/*
多行注释可以嵌套在其它的多行注释之中
*/
*/

3 分号(Semicolons)

单行单挑语句不一定需要,单行多条语句必须

let cat = "?"; print(cat)

4 整数(Integers)

U代表无符号
Int类型与当前系统的位数相同

1
2
3
4
5
6
7
8
UInt8.max
UInt8.min
Int8.max
Int32.max
UInt32.max
Int64.max
UInt64.max
Int.max

5 浮点数(Floating-Point Numbers)

1
2
Double(11.1)                        // 64位
Float(11.1) // 32位

6 类型安全(type safe)和类型推断(type inference)

1
2
let meaningOfLife = 42              // meaningOfLife 会被推测为 Int 类型
let pi = 3.14159 // pi 会被推测为 Double 类型(优先选择 Double 而不是 Float )

7 数值型字面量(Numeric Literals)

1
2
3
4
5
6
7
8
9
10
11
12
// 整数字面量
15
0b1111 // 二进制15
0o17 // 八进制15
0xf // 十六进制15
// 浮点字面量
1.025e2 // 1.025*10^2
1.025e-2 // 1.025*10^-2
0xbp3 // 11*2^3
0xbp-3 // 11*2^-3
0xC.3p0 // (12+3/16)*2^0
100_000 // _增强可读性

8 数值型类型转换(Numeric Type Conversion)

1
2
3
4
5
6
7
8
9
10
// 整数转换
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one) // `UInt16`有一个构造器,接受`UInt8`类型的参数生成`UInt16`
// 整数和浮点数转换
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi2 = Double(three) + pointOneFourOneFiveNine
let integerPi = Int(pi2)
let pi3 = 3 + 0.14159 // 字面量没有特定的类型,所以可以直接相加

9 类型别名(type aliases)

1
2
typealias AudioSample = UInt16
AudioSample.max

10 布尔值

1
2
true
false

11 元组(tuples)

把多个值组合成一个复合值

1
2
3
4
5
6
7
// 元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。
let http404Error = (404, "Not Found") // 一个类型为 (Int, String) 的元组, 用于描述 HTTP 状态码
let (statusCode, statusMessage) = http404Error // 元组的内容分解(decompose)
let (justTheStatusCode, _) = http404Error
http404Error.0 // 下标访问
let http200Status = (statusCode: 200, description: "OK") // 给元组元素命名
http200Status.description

12 可选类型(optionals)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil
var optionalString: String? // optionalString的类型要么是String,要么是nil
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // convertedNumber 被推测为可选的`Int`
// if 语句以及强制解析
// 使用 if 语句和 nil 比较来判断一个可选值是否包含值
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).") // `!`称为可选值的强制解析(forced unwrapping)
}
// optionalString! 报错, 使用!来强制解析值之前,一定要确定可选包含一个非nil 的值。
// 可选绑定(optional binding)
if let actualNumber = Int(possibleNumber) { // 如果`Int(possibleNumber)`强制解析的值不是nil,就赋值给actualNumber,并且语句为ture
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
var someOptional: String? = "some"
var someOtherOptional: String?
if let constantName = someOptional, let anotherConstantName = someOtherOptional{
print("多个可选绑定可以用逗号分隔, 需要每一个语句都为true")
}
// 隐式解析可选类型(implicitly unwrapped optionals): 一个可以自动解析的可选类型
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
if assumedString != nil {
print(assumedString)
}

13 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func canThrowAnErrow() throws {
// 这个函数有可能抛出错误
}
do {
try canThrowAnErrow() // 没有错误消息抛出
} catch {
// 有一个错误消息抛出
}
enum myError: Error {
case OutOfCleanDishes
case MissingIngredients
}
func makeASandwich() throws {
// ...
throw myError.OutOfCleanDishes
}
do {
try makeASandwich()
} catch myError.OutOfCleanDishes {
// washDishes()
} catch myError.MissingIngredients{
// buyGroceries
}

14 断言(assertion)

1
2
let age = -3
//assert(age >= 0, "A person's age cannot be less than zero")

playground文件在andyRon/LearnSwift

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文标题: 以撸代码的形式学习Swift-1:基础(The Basics)
  • 本文作者: AndyRon
  • 发布时间: 2017年07月03日 - 13:39
  • 最后更新: 2018年10月15日 - 18:33
  • 本文链接: http://andyron.com/2017/swift-1-the-basics.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!