Contents

Preface

How This Book Is Organized

About the Sample Code

Contacting the Author

1 Welcome to Modern Swift

Migrating Code

How to Migrate

Migration Lessons

Using Swift

Compiled Applications

Frameworks and Libraries

Scripting

REPL

Playgrounds

Other Swift

Learning Swift

Wrap-up

2 Printing and Mirroring

Basic Printing

Printing Multiple Items

Adding Item Separators

String Interpolation

Controlling Line Feeds

Recipe: Printing to Custom Destinations

Printing to Strings

Printing to Custom Output Streams

Recipe: Printing and String Formats

Swift and Format Specifiers

Format Limitations

Conditional Compilation

Debug Printing

Custom Stream Output

Recipe: Postfix Printing

Quick Looks

Quick Look for Custom Types

Quick Looks for Custom Types in Playgrounds

Playground Quick Looks

Creating Custom Quick Looks for Playgrounds

Built-in Quick Look Types

Third-Party Rendering

Using Dump Functions

Building Custom Mirrors

Recursive Reflection

Building Basic Mirror Descriptions Using Protocol Conformance

Adding Header Docs

Building Header Documentation

Markdown Support

Keywords

Special Swift Concerns

Adding Images to Header Docs

Wrap-up

3 Optionals?!

Optionals 101

Unwrapping Optionals

Forced Unwrapping

Conditional Binding

Conditional Binding and Type Casts

Binding Cascades

guard Statements

Implicitly Unwrapped Optionals

Guarding Failable Initializers

Optionals and Sentinel Values

Coalescing

Optional Assignment

Optional Patterns

Optional Chaining

Selector Testing and Optional Chaining

Subscripts

Optional Mapping

Maps and Chaining

Filtering nil Values with flatMap

Unmanaged Wrappers

Wrap-up

4 Closures and Functions

Building a Function

Parameter Names

Label Conventions

Naming Methods and Functions

External and Local Parameters

Defaults

Constant and Variable Parameters

Modifying Parameters

Closures and Functions

Function Types

Using Tuple Arguments

Using Shorthand Argument Names

Inferred Closure Types

Parameter Type Inference

Declaring Type Aliases

Nested Functions

Tuples

From Tuples to Structs

Tuple Return Types

Variadic Parameters

Capturing Values

Autoclosures

Adding Default Closures

Currying

Why Curry?

Building Libraries

Partial Application

Currying Costs

Currying and Callbacks

Practical Currying

Passing Closures as Function Parameters

Wrap-up

5 Generics and Protocols

Expanding to Generics

Protocols

Tokens

Type Constraints

Adopting Protocols

Declaring Protocols

Member Declarations

Building a Basic Protocol

Adding Protocol Default Implementations

Optional Protocol Requirements

Swift-Native Optional Protocol Requirements

Building Generic Types

Type Parameters

Generic Requirements

Conformance Requirements

Recipe: Same-Type Requirements

Generic Beautification

Legal Tokens

Matching Aliases

Protocol Alias Defaults

Collating Associated Types

Extending Generic Types

Using Protocols as Types

Protocol-Based Collections

Self Requirements

Protocol Objects and Self Requirements

Leveraging Protocols

Wrap-up

6 Errors

Failing Hard

Fatal Errors

Assertions

Preconditions

Aborting and Exiting

Failing Gracefully

The ErrorType Protocol

Choosing Between Optionals and Error Handling

Swift Error Rules

Rule 1: Move Away from nil Sentinels

Rule 2: Use throw to Raise Errors

Rule 3: Use Error Types with Visible Access

Rule 4: Mark All Error-Participating Methods with throws

Rule 5: Use rethrows Consistently

Rule 6: Consume Errors Where They Matter

Rule 7: Terminate Threaded Error Chains

Building Errors

Good Errors

Naming Your Errors

Adding String Descriptions

Adding Reasons

Simplifying Output

Extending String

Type-Specific Errors

Retrieving Context

Contextualizing Strings

Contextualizing Throwing Types

Simplifying Contexts

Calling Throwing Functions

Using try

Error Propagation

Using try!

Using try?

Implementing Alternatives to try?

Guarding Results

Building a Printing Version of try?

Working with guard and defer

Wrap-up

7 Types

Language Concepts

Reference and Value Types

Copy-and-Write-Back

Algebraic Data Types

Other Terminology

Enumerations

Basic Enumerations

Using Hash Values to Support Ranges

Raw Value Enumerations

Raw Value Members and Sequences

Associated Values

Indirect Values

Switches

Branching

Breaks

Fallthroughs

Complex Cases

Tuples

Pattern Matching with Value Bindings

where Clauses

Unwrapping Optional Enumerations

Embedding Values by Type

Option Sets

Revisiting NS_OPTIONS

Building Enumerations

Building Option Sets

Viewing Options

Classes

Optimization

Initializers

Initialization Steps

Designated and Convenience Initializers

Initialization Rules

Building Convenience Initializers

Failable and Throwing Initializers

Deinitializers

Property Observers

Getters/Setters and Access-Level Modifiers

Extensions and Overrides

Lazy Evaluation

Lazy Sequences

Lazy Properties

Wrap-up

8 Miscellany

Statement Labels

Custom Operators

Declaring Operators

Conforming with Operators

Evaluating Operator Trade-offs

Array Indexing

Multi-indexed Array Access

Wrapped Indices

Array Slices

General Subscripting

Parameter-less Subscripting

String Utilities

Repeat Initializers

Strings and Radix

String Ranges

String Splitting

String Subscripts

Foundation Interoperability

Joining and Extending

Permutation Generator

Wrap-up

Index

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.142.123.87