Conventions Used in This BookUsing Code ExamplesO’Reilly SafariHow to Contact UsAcknowledgmentsGetting Started with Swift 3Swift on macOSSwift on LinuxThe Swift REPLSwift as a Scripting LanguageSwift Playgrounds on macOSA Taste of SwiftBasic Language FeaturesCommentsSemicolonsWhitespaceNaming ConventionsImporting Code from Other ModulesTypesSpecific Integer TypesNumeric LiteralsCharacter and String LiteralsType AliasesNested TypesDetermining TypesVariables and ConstantsComputed VariablesVariable ObserversTuplesTuple Variables and ConstantsExtracting Tuple ComponentsNaming Tuple ComponentsUsing Type Aliases with TuplesComparing TuplesTuples as Return TypesOperatorsNo Implicit Type ConversionArithmetic OperatorsBitwise OperatorsAssignment OperatorsComparison OperatorsLogical OperatorsOverflow OperatorsType Casting OperatorsRange OperatorsTernary Conditional OperatorNil-Coalescing OperatorOperator PrecedenceStrings and CharactersString PropertiesComparing StringsEscape Characters in StringsString InterpolationConverting Strings to Numeric TypesConverting Other Types to StringsCharacter-Level Access in StringsString Methods and Inherited FunctionalityArraysAccessing Array ElementsArray PropertiesModifying a Mutable ArrayIterating Over ArraysArray Inherited FunctionalitySlicesDictionariesAccessing Dictionary ElementsDictionary PropertiesModifying a Mutable DictionaryIterating Over DictionariesDictionary Inherited FunctionalitySetsAccessing Set Items and PropertiesModifying a Mutable SetIterating Over SetsSet OperationsSet Inherited FunctionalityOption SetsFunctionsParameter and Argument Namesinout ParametersReturning Optional ValuesReturning Multiple Values with TuplesDefault Parameter ValuesVariadic ParametersFunction TypesClosuresCapturing ValuesCapturing Values by ReferenceClosure AttributesOptionalsUnwrapping OptionalsImplicitly Unwrapped OptionalsOptional BindingOptional ChainingProgram FlowLoopsConditional ExecutionStatement LabelsDo ScopesDeferred ExecutionError HandlingClassesDefining a Base ClassInstancesPropertiesMethodsSubscriptsMember ProtectionInheritance: Deriving One Class from AnotherOverriding Superclass EntitiesPreventing Overrides and SubclassingInitializationInitialization and InheritanceDeinitializationStructuresProperties in StructuresMethods in StructuresType Methods for StructuresInitializers in StructuresEnumerationsRaw Member ValuesAssociated ValuesMethods in EnumerationsType Methods and Properties in EnumerationsRecursive EnumerationsFailable Initializers in EnumerationsAccess ControlSpecifying Access Control LevelsDefault Access Control LevelsExtensionsComputed Property ExtensionsInitializer ExtensionsMethod ExtensionsSubscript ExtensionsChecking and Casting TypesChecking TypesDowncasting TypesThe Any TypesProtocolsProperty RequirementsMethod RequirementsOptional Method and Property RequirementsInitializers in ProtocolsAdopting Protocols with ExtensionsInheritance and ProtocolsUsing a Protocol as a TypeChecking Protocol ConformanceProtocol ExtensionsBuilt-In ProtocolsThe Iterator ProtocolThe Sequence ProtocolThe Collection ProtocolThe FloatingPoint ProtocolMemory ManagementHow Reference Counting WorksReference Cycles and Strong ReferencesWeak ReferencesUnowned ReferencesReference Cycles and ClosuresManual Memory UseGenericsGeneric FunctionsGeneric TypesConstraining TypesGeneric ProtocolsCustom OperatorsCustom Infix OperatorsCustom Unary OperatorsCustom Infix Operator Precedence GroupsRanges and StridesRangesStridesFoundationCommand-Line ArgumentsConditional CompilationDeclaration AttributesThe @available AttributeGlobal (Free) FunctionsChanges from Swift 2