Table of Contents

Open all
Close all
Dedication
19
1 Introduction
21
1.1 About this Book
21
1.2 Welcome to Swift!
23
1.3 Why Learn Swift?
24
1.4 Swift Versus Other Programming Languages
26
1.4.1 Python
27
1.4.2 Java
28
1.4.3 C#
29
1.4.4 JavaScript
29
1.4.5 Dart
30
1.4.6 Kotlin
31
1.4.7 C++
32
1.4.8 Rust
32
1.4.9 Picking the Ideal Language
34
1.5 Setting Up the Development Environment
35
1.5.1 Preparing Your Mac
35
1.5.2 Alternative Options for Swift Development
42
1.6 Summary
43
2 Variables
45
2.1 Variables
45
2.1.1 About Variables and Constants
46
2.1.2 Declaring Simple Variables and Constants
46
2.1.3 Type Annotations
48
2.1.4 Comments
50
2.2 Boolean
52
2.2.1 About Booleans
52
2.2.2 AND Operator
53
2.2.3 OR Operator
55
2.2.4 Nested Conditions
56
2.3 Numbers
58
2.3.1 Numeric Types
58
2.3.2 Arithmetic Operators
65
2.3.3 Comparison Operators
70
2.3.4 Numeric Literals
71
2.4 Text
74
2.4.1 About Strings
74
2.4.2 Basic String Literals
77
2.4.3 Multiline String Literals
77
2.4.4 Escape Sequences
77
2.4.5 Concatenation
79
2.4.6 String Interpolation
80
2.4.7 Checking String Contents
81
2.4.8 Substrings
84
2.4.9 Modifying Strings
87
2.4.10 Comparison Operators
88
2.4.11 String/Number Conversion
90
2.4.12 Regular Expressions
95
2.5 Dates and Times
98
2.5.1 Basic Data Types
98
2.5.2 Arithmetic Operations
100
2.5.3 Comparison
103
2.5.4 Measuring Durations
105
2.5.5 String/Date Conversion
107
2.5.6 Internationalization
111
2.6 Quantities
113
2.6.1 Units
113
2.6.2 Measurement
115
2.6.3 Unit Conversions
116
2.6.4 Arithmetic Operations
117
2.7 Tuples
120
2.7.1 Basic Tuples
120
2.7.2 Named Tuples
122
2.7.3 Tuple Type Annotations
122
2.7.4 Comparison
123
2.8 Type Aliases
124
2.8.1 Basic Types
124
2.8.2 Complex Types
125
2.9 Summary
125
3 Collections
127
3.1 Arrays
128
3.1.1 Creating Arrays
128
3.1.2 Arrays as Constants
129
3.1.3 Accessing Arrays
130
3.1.4 Array Derivation
134
3.1.5 Modifying Arrays
138
3.1.6 Iterating Through Arrays
141
3.2 Sets
148
3.2.1 Creating Sets
150
3.2.2 Sets as Constants
151
3.2.3 Accessing Sets
151
3.2.4 Set Derivation
152
3.2.5 Checking for Supersets
157
3.2.6 Modifying Sets
158
3.2.7 Iterating Through Sets
160
3.3 Dictionaries
162
3.3.1 Creating Dictionaries
163
3.3.2 Dictionaries as Constants
168
3.3.3 Accessing Dictionaries
168
3.3.4 Modifying Dictionaries
170
3.3.5 Iterating Through a Dictionary
172
3.4 Summary
173
4 Control Flow
175
4.1 Conditional Statements
176
4.1.1 If-Else
176
4.1.2 Logical Operators
184
4.1.3 Ternary Operator
187
4.1.4 Nil-Coalescing Operator
189
4.1.5 Switch
192
4.2 Loops
199
4.2.1 For-In Loops
199
4.2.2 While Loops
207
4.2.3 Repeat-While Loops
209
4.3 Control Transfer Statements
211
4.3.1 Break
211
4.3.2 Continue
213
4.3.3 Fallthrough
215
4.3.4 Guard
218
4.4 Summary
221
5 Functions
223
5.1 What Is a Function?
223
5.2 Defining and Calling Functions
226
5.2.1 Defining a Function
226
5.2.2 Calling a Function from the Program
227
5.2.3 Calling a Function from Another Function
229
5.2.4 Variable Scope in Functions
231
5.3 Input Parameters
234
5.3.1 Named Parameters
234
5.3.2 Omitting Argument Labels
237
5.3.3 Default Arguments
239
5.3.4 Guarding Functions
241
5.4 Returning Values
242
5.4.1 Returning Single Values
243
5.4.2 Returning Multiple Values
246
5.5 Variadic Parameters
250
5.6 Function Overloading
253
5.7 Inout Parameters
255
5.8 Nested Functions
258
5.9 Function Types
261
5.9.1 Basic
261
5.9.2 Function Types as Parameter Types
265
5.9.3 Function Types as Return Types
267
5.10 Closures
268
5.10.1 Closure Expressions
269
5.10.2 Trailing Closures
273
5.10.3 Escaping Closures
274
5.10.4 Autoclosures
279
5.11 Generic Functions
280
5.11.1 Generic Functions
280
5.11.2 Type Constraints
283
5.11.3 Generic Where Clauses
288
5.12 Summary
289
6 Optionals
291
6.1 What Are Optionals?
291
6.1.1 Tuple Optionals
291
6.1.2 Simple Variable Optionals
293
6.1.3 Collection Optionals
295
6.1.4 Function Optionals
295
6.2 Optional Binding
296
6.3 Implicitly Unwrapped Optionals
299
6.4 Optional Chaining
300
6.5 Summary
302
7 Enumerations
303
7.1 What Are Enumerations?
303
7.2 Declaring Enumerations
305
7.2.1 Case Values
305
7.2.2 Raw Values
308
7.2.3 Associated Values
310
7.3 Computed Properties
313
7.4 Functions in Enumerations
317
7.5 Iterating over Enumerations
319
7.5.1 Iterating over Case Values
319
7.5.2 Iterating over Raw Values
320
7.5.3 Iterating over Associated Values
321
7.6 Recursive Enumerations
322
7.7 Generic Enumerations
325
7.8 Summary
327
8 Structs
329
8.1 What Is a Struct?
329
8.2 Declaring Structs
331
8.2.1 Basic Struct Declaration
331
8.2.2 Mutable Properties
332
8.2.3 Complex Properties
333
8.2.4 Nested Structs
334
8.2.5 Default Property Values
337
8.2.6 Optional Properties
337
8.3 Static Properties
339
8.4 Computed Properties
341
8.4.1 Getters
341
8.4.2 Setters
343
8.5 Functions
345
8.5.1 Initialization
345
8.5.2 Nonmutating Functions
347
8.5.3 Mutating Functions
348
8.5.4 Static Functions
349
8.6 Encapsulation
351
8.6.1 Private Properties
352
8.6.2 Private Functions
354
8.7 Structs as Function Parameters
355
8.8 Generic Structs
357
8.9 Advanced Features
359
8.9.1 Lazy Properties
359
8.9.2 Property Observers
362
8.9.3 Property Wrappers
363
8.9.4 Subscripts
365
8.9.5 Failable Initialization
367
8.10 Summary
369
9 Classes
371
9.1 Declaring Classes
372
9.1.1 Basic Class Declaration
372
9.1.2 Reference Semantics
373
9.1.3 Composition
375
9.2 Functions
380
9.2.1 Mutability
380
9.2.2 Deinitialization
381
9.2.3 Convenience Initialization
384
9.3 Inheritance
385
9.3.1 Superclasses and Subclasses
385
9.3.2 Overriding Functions
392
9.3.3 Overriding Initializers
395
9.3.4 Overriding Computed Properties
397
9.3.5 Overriding Subscripts
399
9.3.6 Casting
401
9.3.7 AnyObject Type
407
9.4 Classes as Function Parameters
409
9.5 Memory Management
412
9.5.1 Strong References
412
9.5.2 Weak References
415
9.5.3 Unowned References
418
9.6 Summary
419
10 Protocols
421
10.1 Purpose of Protocols
421
10.2 Function Requirements
425
10.2.1 Nonmutating Function
425
10.2.2 Mutating Function
428
10.2.3 Static Function
429
10.3 Initializer Requirements
431
10.4 Property Requirements
433
10.4.1 Get Requirement
433
10.4.2 Get Set Requirement
435
10.4.3 Static Requirement
436
10.5 Implementing Multiple Protocols
437
10.6 Checking for Protocol Conformance
440
10.7 Protocols as Function Parameters
442
10.7.1 Protocol Type
442
10.7.2 Existential Type
443
10.7.3 Opaque Type
444
10.8 Associated Types
445
10.9 Using Standard Protocols
448
10.9.1 Equatable
448
10.9.2 Comparable
451
10.9.3 Identifiable
454
10.9.4 Hashable
455
10.9.5 CustomStringConvertible
457
10.10 Summary
459
11 Extensions
461
11.1 Extending Enumerations
462
11.2 Extending Structs
464
11.3 Extending Classes
466
11.4 Extending Protocols
468
11.5 Operator Extensions
470
11.5.1 Arithmetic and Boolean Operators
470
11.5.2 Equality and Comparison Operators
473
11.5.3 Prefix and Postfix Operators
475
11.5.4 Custom Operators
476
11.6 Extending Swift Data Types
478
11.6.1 Sample Usage
478
11.6.2 Avoiding Name Conflicts
479
11.7 Generic Extensions
480
11.8 Summary
482
12 Error Handling
483
12.1 Understanding Errors in Swift
484
12.2 Throwing Errors
486
12.2.1 Throwing Built-in Errors
486
12.2.2 Throwing Custom Errors
488
12.2.3 Propagating Errors
490
12.3 Catching Errors
492
12.3.1 Direct Pattern Matching
492
12.3.2 Error Pattern Matching
496
12.3.3 Localized Error Messages
499
12.3.4 Optional Try
502
12.4 Cleanup with Defer
504
12.5 Runtime Checks
508
12.5.1 Debug Runtime Checks
508
12.5.2 Release Runtime Checks
512
12.6 Summary
513
13 File Handling
515
13.1 Text Files
515
13.1.1 Reading Text Files
516
13.1.2 Writing Text Files
519
13.2 Binary Files
522
13.2.1 Reading Binary Files
523
13.2.2 Writing Binary Files
525
13.3 Working with Common Formats
529
13.3.1 JSON
529
13.3.2 Property List
535
13.4 File System Operations
542
13.4.1 Examining Folders
542
13.4.2 Manipulating Folders
545
13.4.3 Examining Files
548
13.4.4 Manipulating Files
550
13.5 Summary
554
14 Concurrency
555
14.1 What Is Concurrency?
555
14.2 Async Functions
557
14.2.1 Writing Async Functions
557
14.2.2 Calling Async Functions
559
14.2.3 Running Functions in Parallel
565
14.3 Tasks
569
14.3.1 Creating Tasks
570
14.3.2 Task Groups
574
14.3.3 Task Priorities
581
14.3.4 Task Cancellation
585
14.4 Async Streams
588
14.4.1 Starting an Async Stream
588
14.4.2 Canceling an Async Stream
590
14.4.3 Handling Async Stream Errors
591
14.5 Shared State Safety
593
14.5.1 Task-Local Values
594
14.5.2 Detached Tasks
597
14.5.3 Actors
599
14.5.4 Sendable Types
602
14.6 Summary
606
15 Modules in Swift
607
15.1 Introduction to Modules
607
15.1.1 What Is a Module?
607
15.1.2 Why Use Modules?
610
15.2 Working with Frameworks
613
15.2.1 Setting Up a New Framework
614
15.2.2 Adding Code to a Framework
615
15.2.3 Building a Framework
616
15.2.4 Importing a Framework
618
15.3 Working with Packages
621
15.3.1 Setting Up a New Package
622
15.3.2 Adding Code to a Package
624
15.3.3 Importing a Package
624
15.4 Access Control
629
15.4.1 Open
629
15.4.2 Public
629
15.4.3 Internal
630
15.4.4 File Private
630
15.4.5 Private
631
15.5 Summary
631
16 Conclusion
633
Appendices
635
A Unit Testing
635
B Debugging
655
C The Author
673
Index
675