The Swift Programming Language 1st Apple Inc download
The Swift Programming Language 1st Apple Inc download
download
https://ebookbell.com/product/the-swift-programming-language-1st-
apple-inc-4690502
https://ebookbell.com/product/the-swift-programming-language-
swift-57-apple-inc-50090374
https://ebookbell.com/product/the-swift-programming-language-
swift-21-apple-inc-57954152
https://ebookbell.com/product/the-swift-programming-language-inc-
apple-22130798
https://ebookbell.com/product/the-swift-programming-language-apple-
inc-34614754
The Swift Programming Language Swift 53 Apple Inc
https://ebookbell.com/product/the-swift-programming-language-
swift-53-apple-inc-34614756
https://ebookbell.com/product/the-swift-programming-language-
swift-55-apple-inc-36444848
https://ebookbell.com/product/the-swift-programming-language-
swift-57-57-apple-inc-44480436
https://ebookbell.com/product/the-swift-programming-language-
prerelease-apple-inc-4690428
https://ebookbell.com/product/the-swift-programming-language-
swift-4-apple-inc-7177452
Welcome to Swift
About Swift
Swift is a new programming language for iOS and OS X apps that builds on the best of C
and Objective-C, without the constraints of C compatibility. Swift adopts safe
programming patterns and adds modern features to make programming easier, more
flexible, and more fun. Swift’s clean slate, backed by the mature and much-loved Cocoa
and Cocoa Touch frameworks, is an opportunity to reimagine how software development
works.
Swift has been years in the making. Apple laid the foundation for Swift by advancing our
existing compiler, debugger, and framework infrastructure. We simplified memory
management with Automatic Reference Counting (ARC). Our framework stack, built on
the solid base of Foundation and Cocoa, has been modernized and standardized
throughout. Objective-C itself has evolved to support blocks, collection literals, and
modules, enabling framework adoption of modern language technologies without
disruption. Thanks to this groundwork, we can now introduce a new language for the
future of Apple software development.
Swift feels familiar to Objective-C developers. It adopts the readability of Objective-C’s
named parameters and the power of Objective-C’s dynamic object model. It provides
seamless access to existing Cocoa frameworks and mix-and-match interoperability with
Objective-C code. Building from this common ground, Swift introduces many new features
and unifies the procedural and object-oriented portions of the language.
Swift is friendly to new programmers. It is the first industrial-quality systems
programming language that is as expressive and enjoyable as a scripting language. It
supports playgrounds, an innovative feature that allows programmers to experiment with
Swift code and see the results immediately, without the overhead of building and running
an app.
Swift combines the best in modern language thinking with wisdom from the wider Apple
engineering culture. The compiler is optimized for performance, and the language is
optimized for development, without compromising on either. It’s designed to scale from
“hello, world” to an entire operating system. All this makes Swift a sound future
investment for developers and for Apple.
Swift is a fantastic way to write iOS and OS X apps, and will continue to evolve with new
features and capabilities. Our goals for Swift are ambitious. We can’t wait to see what
you create with it.
A Swift Tour
Tradition suggests that the first program in a new language should print the words “Hello,
world” on the screen. In Swift, this can be done in a single line:
println("Hello, world")
If you have written code in C or Objective-C, this syntax looks familiar to you—in Swift,
this line of code is a complete program. You don’t need to import a separate library for
functionality like input/output or string handling. Code written at global scope is used as
the entry point for the program, so you don’t need a main function. You also don’t need to
write semicolons at the end of every statement.
This tour gives you enough information to start writing code in Swift by showing you how
to accomplish a variety of programming tasks. Don’t worry if you don’t understand
something—everything introduced in this tour is explained in detail in the rest of this
book.
NOT E
For the best experience, open this chapter as a playground in Xcode. Playgrounds allow you to edit the code
listings and see the result immediately.
Simple Values
Use let to make a constant and var to make a variable. The value of a constant doesn’t
need to be known at compile time, but you must assign it a value exactly once. This
means you can use constants to name a value that you determine once but use in many
places.
var myVariable = 42
myVariable = 50
let myConstant = 42
A constant or variable must have the same type as the value you want to assign to it.
However, you don’t always have to write the type explicitly. Providing a value when you
create a constant or variable lets the compiler infer its type. In the example above, the
compiler infers that myVariable is an integer because its initial value is a integer.
If the initial value doesn’t provide enough information (or if there is no initial value),
specify the type by writing it after the variable, separated by a colon.
let implicitInteger = 70
EX PERI M ENT
Create a constant with an explicit type of Float and a value of 4.
Values are never implicitly converted to another type. If you need to convert a value to a
different type, explicitly make an instance of the desired type.
let width = 94
EX PERI M ENT
Try removing the conversion to String from the last line. What error do you get?
There’s an even simpler way to include values in strings: Write the value in parentheses,
and write a backslash (\) before the parentheses. For example:
let apples = 3
let oranges = 5
EX PERI M ENT
Use \() to include a floating-point calculation in a string and to include someone’s name in a greeting.
Create arrays and dictionaries using brackets ([]), and access their elements by writing
the index or key in brackets.
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
If type information can be inferred, you can write an empty array as [] and an empty
dictionary as [:]—for example, when you set a new value for a variable or pass an
argument to a function.
Control Flow
Use if and switch to make conditionals, and use for-in, for, while, and do-while to make loops.
Parentheses around the condition or loop variable are optional. Braces around the body
are required.
var teamScore = 0
if score > 50 {
teamScore += 3
} else {
teamScore += 1
mScore
optionalString == nil
EX PERI M ENT
Change optionalName to nil. What greeting do you get? Add an else clause that sets a different greeting if
optionalName is nil.
If the optional value is nil, the conditional is false and the code in braces is skipped.
Otherwise, the optional value is unwrapped and assigned to the constant after let, which
makes the unwrapped value available inside the block of code.
Switches support any kind of data and a wide variety of comparison operations—they
aren’t limited to integers and tests for equality.
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
default:
EX PERI M ENT
Try removing the default case. What error do you get?
After executing the code inside the switch case that matched, the program exits from the
switch statement. Execution doesn’t continue to the next case, so there is no need to
explicitly break out of the switch at the end of each case’s code.
You use for-in to iterate over items in a dictionary by providing a pair of names to use for
each key-value pair.
let interestingNumbers = [
var largest = 0
largest = number
}
st
EX PERI M ENT
Add another variable to keep track of which kind of number was the largest, as well as what that largest
number was.
Use while to repeat a block of code until a condition changes. The condition of a loop can
be at the end instead, ensuring that the loop is run at least once.
var n = 2
n=n*2
var m = 2
do {
m=m*2
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
firstForLoop
var secondForLoop = 0
ndForLoop
Use .. to make a range that omits its upper value, and use ... to make a range that
includes both values.
greet("Bob", "Tuesday")
EX PERI M ENT
Remove the day parameter. Add a parameter to include today’s lunch special in the greeting.
getGasPrices()
Functions can also take a variable number of arguments, collecting them into an array.
var sum = 0
sum += number
}
return sum
sumOf()
EX PERI M ENT
Write a function that calculates the average of its arguments.
Functions can be nested. Nested functions have access to variables that were declared in
the outer function. You can use nested functions to organize the code in a function that is
long or complex.
var y = 10
func add() {
y += 5
add()
return y
returnFifteen()
Functions are a first-class type. This means that a function can return another function as
its value.
return 1 + number
return addOne
if condition(item) {
return true
return false
AnyMatches(numbers, lessThanTen)
Functions are actually a special case of closures. You can write a closure without a name
by surrounding code with braces ({}). Use in to separate the arguments and return type
from the body.
numbers.map({
return result
})
EX PERI M ENT
Rewrite the closure to return zero for all odd numbers.
You have several options for writing closures more concisely. When a closure’s type is
already known, such as the callback for a delegate, you can omit the type of its
parameters, its return type, or both. Single statement closures implicitly return the value
of their only statement.
class Shape {
var numberOfSides = 0
EX PERI M ENT
Add a constant property with let, and add another method that takes an argument.
Create an instance of a class by putting parentheses after the class name. Use dot syntax
to access the properties and methods of the instance.
shape.numberOfSides = 7
This version of the Shape class is missing something important: an initializer to set up the
class when an instance is created. Use init to create one.
class NamedShape {
init(name: String) {
self.name = name
Notice how self is used to distinguish the name property from the name argument to the
initializer. The arguments to the initializer are passed like a function call when you create
an instance of the class. Every property needs a value assigned—either in its declaration
(as with numberOfSides) or in the initializer (as with name).
Use deinit to create a deinitializer if you need to perform some cleanup before the object is
deallocated.
Subclasses include their superclass name after their class name, separated by a colon.
There is no requirement for classes to subclass any standard root class, so you can
include or omit a superclass as needed.
Methods on a subclass that override the superclass’s implementation are marked with
override—overriding a method by accident, without override, is detected by the compiler as an
error. The compiler also detects methods with override that don’t actually override any
method in the superclass.
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
area()
simpleDescription()
EX PERI M ENT
Make another subclass of NamedShape called Circle that takes a radius and a name as arguments to its
initializer. Implement an area and a describe method on the Circle class.
In addition to simple properties that are stored, properties can have a getter and a
setter.
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
ar perimeter: Double {
et {
et {
gle.perimeter
gle.perimeter = 9.9
gle.sideLength
In the setter for perimeter, the new value has the implicit name newValue. You can provide an
explicit name in parentheses after set.
Notice that the initializer for the EquilateralTriangle class has three different steps:
If you don’t need to compute the property but still need to provide code that is run before
and after setting a new value, use willSet and didSet. For example, the class below ensures
that the side length of its triangle is always the same as the side length of its square.
class TriangleAndSquare {
square.sideLength = newValue.sideLength
willSet {
triangle.sideLength = newValue.sideLength
gleAndSquare.square.sideLength
gleAndSquare.triangle.sideLength
gleAndSquare.triangle.sideLength
Methods on classes have one important difference from functions. Parameter names in
functions are used only within the function, but parameters names in methods are also
used when you call the method (except for the first parameter). By default, a method has
the same name for its parameters when you call it and within the method itself. You can
specify a second name, which is used inside the method.
class Counter {
When working with optional values, you can write ? before operations like methods,
properties, and subscripting. If the value before the ? is nil, everything after the ? is
ignored and the value of the whole expression is nil. Otherwise, the optional value is
unwrapped, and everything after the ? acts on the unwrapped value. In both cases, the
value of the whole expression is an optional value.
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
ce = Rank.Ace
ceRawValue = ace.toRaw()
EX PERI M ENT
Write a function that compares two Rank values by comparing their raw values.
In the example above, the raw value type of the enumeration is Int, so you only have to
specify the first raw value. The rest of the raw values are assigned in order. You can also
use strings or floating-point numbers as the raw type of an enumeration.
Use the toRaw and fromRaw functions to convert between the raw value and the enumeration
value.
The member values of an enumeration are actual values, not just another way of writing
their raw values. In fact, in cases where there isn’t a meaningful raw value, you don’t
have to provide one.
enum Suit {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
earts = Suit.Hearts
eartsDescription = hearts.simpleDescription()
EX PERI M ENT
Add a color method to Suit that returns “black” for spades and clubs, and returns “red” for hearts and
diamonds.
Notice the two ways that the Hearts member of the enumeration is referred to above:
When assigning a value to the hearts constant, the enumeration member Suit.Hearts is
referred to by its full name because the constant doesn’t have an explicit type specified.
Inside the switch, the enumeration is referred to by the abbreviated form .Hearts because
the value of self is already known to be a suit. You can use the abbreviated form anytime
the value’s type is already known.
Use struct to create a structure. Structures support many of the same behaviors as classes,
including methods and initializers. One of the most important differences between
structures and classes is that structures are always copied when they are passed around
in your code, but classes are passed by reference.
struct Card {
EX PERI M ENT
Add a method to Card that creates a full deck of cards, with one card of each combination of rank and suit.
An instance of an enumeration member can have values associated with the instance.
Instances of the same enumeration member can have different values associated with
them. You provide the associated values when you create the instance. Associated values
and raw values are different: The raw value of an enumeration member is the same for
all of its instances, and you provide the raw value when you define the enumeration.
For example, consider the case of requesting the sunrise and sunset time from a server.
The server either responds with the information or it responds with some error
information.
enum ServerResponse {
case Error(String)
switch success {
let .Error(error):
EX PERI M ENT
Add a third case to ServerResponse and to the switch.
Notice how the sunrise and sunset times are extracted from the ServerResponse value as part
of matching the value against the switch cases.
Protocols and Extensions
Use protocol to declare a protocol.
protocol ExampleProtocol {
func adjust() {
var a = SimpleClass()
a.adjust()
Description = a.simpleDescription
SimpleStructure: ExampleProtocol {
= SimpleStructure()
just()
Description = b.simpleDescription
EX PERI M ENT
EX PERI M ENT
Write an enumeration that conforms to this protocol.
Notice the use of the mutating keyword in the declaration of SimpleStructure to mark a method
that modifies the structure. The declaration of SimpleClass doesn’t need any of its methods
marked as mutating because methods on a class can always modify the class.
Use extension to add functionality to an existing type, such as new methods and computed
properties. You can use an extension to add protocol conformance to a type that is
declared elsewhere, or even to a type that you imported from a library or framework.
self += 42
7.simpleDescription
EX PERI M ENT
Write an extension for the Double type that adds an absoluteValue property.
You can use a protocol name just like any other named type—for example, to create a
collection of objects that have different types but that all conform to a single protocol.
When you work with values whose type is a protocol type, methods outside the protocol
definition are not available.
protocolValue.simpleDescription
Even though the variable protocolValue has a runtime type of SimpleClass, the compiler treats it
as the given type of ExampleProtocol. This means that you can’t accidentally access methods
or properties that the class implements in addition to its protocol conformance.
Generics
for i in 0..times {
result += item
return result
repeat("knock", 4)
You can make generic forms of functions and methods, as well as classes, enumerations,
and structures.
enum OptionalValue<T> {
case None
case Some(T)
possibleInteger = .Some(100)
Use where after the type name to specify a list of requirements—for example, to require
the type to implement a protocol, to require two types to be the same, or to require a
class to have a particular superclass.
if lhsItem == rhsItem {
return true
return false
EX PERI M ENT
Modify the anyCommonElements function to make a function that returns an array of the elements that any
two sequences have in common.
In the simple cases, you can omit where and simply write the protocol or class name after
a colon. Writing <T: Equatable> is the same as writing <T where T: Equatable>.
Language Guide
The Basics
Swift is a new programming language for iOS and OS X app development. Nonetheless,
many parts of Swift will be familiar from your experience of developing in C and
Objective-C.
Swift provides its own versions of all fundamental C and Objective-C types, including Int
for integers; Double and Float for floating-point values; Bool for Boolean values; and String for
textual data. Swift also provides powerful versions of the two primary collection types,
Array and Dictionary , as described in Collection Types.
Like C, Swift uses variables to store and refer to values by an identifying name. Swift also
makes extensive use of variables whose values cannot be changed. These are known as
constants, and are much more powerful than constants in C. Constants are used
throughout Swift to make code safer and clearer in intent when you work with values that
do not need to change.
In addition to familiar types, Swift introduces advanced types not found in Objective-C.
These include tuples, which enable you to create and pass around groupings of values.
Tuples can return multiple values from a function as a single compound value.
Swift also introduces optional types, which handle the absence of a value. Optionals say
either “there is a value, and it equals x” or “there isn’t a value at all”. Optionals are
similar to using nil with pointers in Objective-C, but they work for any type, not just
classes. Optionals are safer and more expressive than nil pointers in Objective-C and are
at the heart of many of Swift’s most powerful features.
Optionals are an example of the fact that Swift is a type safe language. Swift helps you to
be clear about the types of values your code can work with. If part of your code expects a
String, type safety prevents you from passing it an Int by mistake. This enables you to catch
and fix errors as early as possible in the development process.
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
NOT E
If a stored value in your code is not going to change, always declare it as a constant with the let keyword.
Use variables only for storing values that need to be able to change.
Type Annotations
You can provide a type annotation when you declare a constant or variable, to be clear
about the kind of values the constant or variable can store. Write a type annotation by
placing a colon after the constant or variable name, followed by a space, followed by the
name of the type to use.
This example provides a type annotation for a variable called welcomeMessage, to indicate
that the variable can store String values:
The phrase “of type String” means “can store any String value.” Think of it as meaning “the
type of thing” (or “the kind of thing”) that can be stored.
The welcomeMessage variable can now be set to any string value without error:
welcomeMessage = "Hello"
NOT E
It is rare that you need to write type annotations in practice. If you provide an initial value for a constant or
variable at the point that it is defined, Swift can almost always infer the type to be used for that constant or
variable, as described in Type Safety and Type Inference. In the welcomeMessage example above, no initial
value is provided, and so the type of the welcomeMessage variable is specified with a type annotation rather
than being inferred from an initial value.
let π = 3.14159
let 你好 = "你好世界"
let = "dogcow"
Constant and variable names cannot contain mathematical symbols, arrows, private-use
(or invalid) Unicode code points, or line- and box-drawing characters. Nor can they begin
with a number, although numbers may be included elsewhere within the name.
Once you’ve declared a constant or variable of a certain type, you can’t redeclare it again
with the same name, or change it to store values of a different type. Nor can you change
a constant into a variable or a variable into a constant.
NOT E
If you need to give a constant or variable the same name as a reserved Swift keyword, you can do so by
surrounding the keyword with back ticks (`) when using it as a name. However, you should avoid using
keywords as names unless you have absolutely no choice.
You can change the value of an existing variable to another value of a compatible type.
In this example, the value of friendlyWelcome is changed from "Hello!" to "Bonjour!":
friendlyWelcome = "Bonjour!"
Unlike a variable, the value of a constant cannot be changed once it is set. Attempting to
do so is reported as an error when your code is compiled:
languageName = "Swift++"
println(friendlyWelcome)
// prints "Bonjour!"
println("This is a string")
The println function can print more complex logging messages, in a similar manner to
Cocoa’s NSLog function. These messages can include the current values of constants and
variables.
Swift uses string interpolation to include the name of a constant or variable as a
placeholder in a longer string, and to prompt Swift to replace it with the current value of
that constant or variable. Wrap the name in parentheses and escape it with a backslash
before the opening parenthesis:
NOT E
All options you can use with string interpolation are described in String Interpolation.
Comments
Use comments to include non-executable text in your code, as a note or reminder to
yourself. Comments are ignored by the Swift compiler when your code is compiled.
Comments in Swift are very similar to comments in C. Single-line comments begin with
two forward-slashes (//):
// this is a comment
You can also write multiline comments, which start with a forward-slash followed by an
asterisk (/*) and end with an asterisk followed by a forward-slash (*/):
Unlike multiline comments in C, multiline comments in Swift can be nested inside other
multiline comments. You write nested comments by starting a multiline comment block
and then starting a second multiline comment within the first block. The second block is
then closed, followed by the first block:
Nested multiline comments enable you to comment out large blocks of code quickly and
easily, even if the code already contains multiline comments.
Semicolons
Unlike many other languages, Swift does not require you to write a semicolon (;) after
each statement in your code, although you can do so if you wish. Semicolons are
required, however, if you want to write multiple separate statements on a single line:
Integers
Integers are whole numbers with no fractional component, such as 42 and -23. Integers
are either signed (positive, zero, or negative) or unsigned (positive or zero).
Swift provides signed and unsigned integers in 8, 16, 32, and 64 bit forms. These integers
follow a naming convention similar to C, in that an 8-bit unsigned integer is of type UInt8,
and a 32-bit signed integer is of type Int32. Like all types in Swift, these integer types
have capitalized names.
Integer Bounds
You can access the minimum and maximum values of each integer type with its min and
max properties:
The values of these properties are of the appropriate-sized number type (such as UInt8 in
the example above) and can therefore be used in expressions alongside other values of
the same type.
Int
In most cases, you don’t need to pick a specific size of integer to use in your code. Swift
provides an additional integer type, Int, which has the same size as the current platform’s
native word size:
Unless you need to work with a specific size of integer, always use Int for integer values in
your code. This aids code consistency and interoperability. Even on 32-bit platforms, Int
can store any value between -2,147,483,648 and 2,147,483,647, and is large enough for many
integer ranges.
UInt
Swift also provides an unsigned integer type, UInt, which has the same size as the current
platform’s native word size:
NOT E
Use UInt only when you specifically need an unsigned integer type with the same size as the platform’s native
word size. If this is not the case, Int is preferred, even when the values to be stored are known to be non-
negative. A consistent use of Int for integer values aids code interoperability, avoids the need to convert
between different number types, and matches integer type inference, as described in Type Safety and Type
Inference.
Floating-Point Numbers
Floating-point numbers are numbers with a fractional component, such as 3.14159, 0.1, and
-273.15.
Floating-point types can represent a much wider range of values than integer types, and
can store numbers that are much larger or smaller than can be stored in an Int. Swift
provides two signed floating-point number types:
NOT E
Double has a precision of at least 15 decimal digits, whereas the precision of Float can be as little as 6 decimal
digits. The appropriate floating-point type to use depends on the nature and range of values you need to work
with in your code.
Swift is a type safe language. A type safe language encourages you to be clear about the
types of values your code can work with. If part of your code expects a String, you can’t
pass it an Int by mistake.
Because Swift is type safe, it performs type checks when compiling your code and flags
any mismatched types as errors. This enables you to catch and fix errors as early as
possible in the development process.
Type-checking helps you avoid errors when you’re working with different types of values.
However, this doesn’t mean that you have to specify the type of every constant and
variable that you declare. If you don’t specify the type of value you need, Swift uses type
inference to work out the appropriate type. Type inference enables a compiler to deduce
the type of a particular expression automatically when it compiles your code, simply by
examining the values you provide.
Because of type inference, Swift requires far fewer type declarations than languages such
as C or Objective-C. Constants and variables are still explicitly typed, but much of the
work of specifying their type is done for you.
Type inference is particularly useful when you declare a constant or variable with an
initial value. This is often done by assigning a literal value (or literal) to the constant or
variable at the point that you declare it. (A literal value is a value that appears directly in
your source code, such as 42 and 3.14159 in the examples below.)
For example, if you assign a literal value of 42 to a new constant without saying what type
it is, Swift infers that you want the constant to be an Int, because you have initialized it
with a number that looks like an integer:
let meaningOfLife = 42
let pi = 3.14159
Swift always chooses Double (rather than Float) when inferring the type of floating-point
numbers.
If you combine integer and floating-point literals in an expression, a type of Double will be
inferred from the context:
The literal value of 3 has no explicit type in and of itself, and so an appropriate output
type of Double is inferred from the presence of a floating-point literal as part of the
addition.
Numeric Literals
Integer literals can be written as:
let decimalInteger = 17
For decimal numbers with an exponent of exp, the base number is multiplied by 10exp:
For hexadecimal numbers with an exponent of exp, the base number is multiplied by 2exp:
Numeric literals can contain extra formatting to make them easier to read. Both integers
and floats can be padded with extra zeroes and can contain underscores to help with
readability. Neither type of formatting affects the underlying value of the literal:
Integer Conversion
The range of numbers that can be stored in an integer constant or variable is different for
each numeric type. An Int8 constant or variable can store numbers between -128 and 127,
whereas a UInt8 constant or variable can store numbers between 0 and 255. A number that
will not fit into a constant or variable of a sized integer type is reported as an error when
your code is compiled:
// UInt8 cannot store negative numbers, and so this will report an error
Because each numeric type can store a different range of values, you must opt in to
numeric type conversion on a case-by-case basis. This opt-in approach prevents hidden
conversion errors and helps make type conversion intentions explicit in your code.
To convert one specific number type to another, you initialize a new number of the
desired type with the existing value. In the example below, the constant twoThousand is of
type UInt16, whereas the constant one is of type UInt8. They cannot be added together
directly, because they are not of the same type. Instead, this example calls UInt16(one) to
create a new UInt16 initialized with the value of one, and uses this value in place of the
original:
Because both sides of the addition are now of type UInt16, the addition is allowed. The
output constant (twoThousandAndOne) is inferred to be of type UInt16, because it is the sum of
two UInt16 values.
is the default way to call the initializer of a Swift type and pass in an
SomeType(ofInitialValue)
initial value. Behind the scenes, UInt16 has an initializer that accepts a UInt8 value, and so
this initializer is used to make a new UInt16 from an existing UInt8. You can’t pass in any
type here, however—it has to be a type for which UInt16 provides an initializer. Extending
existing types to provide initializers that accept new types (including your own type
definitions) is covered in Extensions.
let three = 3
Here, the value of the constant three is used to create a new value of type Double, so that
both sides of the addition are of the same type. Without this conversion in place, the
addition would not be allowed.
The reverse is also true for floating-point to integer conversion, in that an integer type
can be initialized with a Double or Float value:
Floating-point values are always truncated when used to initialize a new integer value in
this way. This means that 4.75 becomes 4, and -3.9 becomes -3.
NOT E
The rules for combining numeric constants and variables are different from the rules for numeric literals. The
literal value 3 can be added directly to the literal value 0.14159, because number literals do not have an explicit
type in and of themselves. Their type is inferred only at the point that they are evaluated by the compiler.
Type Aliases
Type aliases define an alternative name for an existing type. You define type aliases with
the typealias keyword.
Type aliases are useful when you want to refer to an existing type by a name that is
contextually more appropriate, such as when working with data of a specific size from an
external source:
Once you define a type alias, you can use the alias anywhere you might use the original
name:
// maxAmplitudeFound is now 0
Here, AudioSample is defined as an alias for UInt16. Because it is an alias, the call to
AudioSample.min actually calls UInt16.min, which provides an initial value of 0 for the
maxAmplitudeFound variable.
Booleans
Swift has a basic Boolean type, called Bool. Boolean values are referred to as logical,
because they can only ever be true or false. Swift provides two Boolean constant values,
true and false:
The types of orangesAreOrange and turnipsAreDelicious have been inferred as Bool from the fact that
they were initialized with Boolean literal values. As with Int and Double above, you don’t
need to declare constants or variables as Bool if you set them to true or false as soon as you
create them. Type inference helps make Swift code more concise and readable when it
initializes constants or variables with other values whose type is already known.
Boolean values are particularly useful when you work with conditional statements such as
the if statement:
if turnipsAreDelicious {
} else {
let i = 1
if i {
let i = 1
if i == 1 {
The result of the i == 1 comparison is of type Bool, and so this second example passes the
type-check. Comparisons like i == 1 are discussed in Basic Operators.
As with other examples of type safety in Swift, this approach avoids accidental errors and
ensures that the intention of a particular section of code is always clear.
Tuples
Tuples group multiple values into a single compound value. The values within a tuple can
be of any type and do not have to be of the same type as each other.
In this example, (404, "Not Found") is a tuple that describes an HTTP status code. An HTTP
status code is a special value returned by a web server whenever you request a web
page. A status code of 404 Not Found is returned if you request a webpage that doesn’t exist.
The (404, "Not Found") tuple groups together an Int and a String to give the HTTP status code
two separate values: a number and a human-readable description. It can be described as
“a tuple of type (Int, String)”.
You can create tuples from any permutation of types, and they can contain as many
different types as you like. There’s nothing stopping you from having a tuple of type (Int,
Int, Int), or (String, Bool), or indeed any other permutation you require.
You can decompose a tuple’s contents into separate constants or variables, which you
then access as usual:
If you only need some of the tuple’s values, ignore parts of the tuple with an underscore
(_) when you decompose the tuple:
Alternatively, access the individual element values in a tuple using index numbers
starting at zero:
You can name the individual elements in a tuple when the tuple is defined:
If you name the elements in a tuple, you can use the element names to access the values
of those elements:
Tuples are particularly useful as the return values of functions. A function that tries to
retrieve a web page might return the (Int, String) tuple type to describe the success or
failure of the page retrieval. By returning a tuple with two distinct values, each of a
different type, the function provides more useful information about its outcome than if it
could only return a single value of a single type. For more information, see Functions with
Multiple Return Values.
NOT E
Tuples are useful for temporary groups of related values. They are not suited to the creation of complex data
structures. If your data structure is likely to persist beyond a temporary scope, model it as a class or
structure, rather than as a tuple. For more information, see Classes and Structures.
Optionals
You use optionals in situations where a value may be absent. An optional says:
or
NOT E
The concept of optionals doesn’t exist in C or Objective-C. The nearest thing in Objective-C is the ability to
return nil from a method that would otherwise return an object, with nil meaning “the absence of a valid
object.” However, this only works for objects—it doesn’t work for structs, basic C types, or enumeration
values. For these types, Objective-C methods typically return a special value (such as NSNotFound) to
indicate the absence of a value. This approach assumes that the method’s caller knows there is a special
value to test against and remembers to check for it. Swift’s optionals let you indicate the absence of a value
for any type at all, without the need for special constants.
Here’s an example. Swift’s String type has a method called toInt, which tries to convert a
String value into an Int value. However, not every string can be converted into an integer.
The string "123" can be converted into the numeric value 123, but the string "hello, world" does
not have an obvious numeric value to convert to.
The example below uses the toInt method to try to convert a String into an Int:
Because the toInt method might fail, it returns an optional Int, rather than an Int. An
optional Int is written as Int?, not Int. The question mark indicates that the value it contains
is optional, meaning that it might contain some Int value, or it might contain no value at
all. (It can’t contain anything else, such as a Bool value or a String value. It’s either an Int, or
it’s nothing at all.)
Once you’re sure that the optional does contain a value, you can access its underlying
value by adding an exclamation mark (!) to the end of the optional’s name. The
exclamation mark effectively says, “I know that this optional definitely has a value;
please use it.” This is known as forced unwrapping of the optional’s value:
if convertedNumber {
} else {
NOT E
Trying to use ! to access a non-existent optional value triggers a runtime error. Always make sure that an
optional contains a non-nil value before using ! to force-unwrap its value.
Optional Binding
You use optional binding to find out whether an optional contains a value, and if so, to
make that value available as a temporary constant or variable. Optional binding can be
used with if and while statements to check for a value inside an optional, and to extract
that value into a constant or variable, as part of a single action. if and while statements are
described in more detail in Control Flow.
Write optional bindings for the if statement as follows:
statements
You can rewrite the possibleNumber example from above to use optional binding rather than
forced unwrapping:
} else {
If the conversion is successful, the actualNumber constant becomes available for use within
the first branch of the if statement. It has already been initialized with the value
contained within the optional, and so there is no need to use the ! suffix to access its
value. In this example, actualNumber is simply used to print the result of the conversion.
You can use both constants and variables with optional binding. If you wanted to
manipulate the value of actualNumber within the first branch of the if statement, you could
write if var actualNumber instead, and the value contained within the optional would be made
available as a variable rather than a constant.
nil
You set an optional variable to a valueless state by assigning it the special value nil:
serverResponseCode = nil
NOT E
nil cannot be used with non-optional constants and variables. If a constant or variable in your code needs to
be able to cope with the absence of a value under certain conditions, always declare it as an optional value of
the appropriate type.
If you define an optional constant or variable without providing a default value, the
constant or variable is automatically set to nil for you:
NOT E
Swift’s nil is not the same as nil in Objective-C. In Objective-C, nil is a pointer to a non-existent object. In
Swift, nil is not a pointer—it is the absence of a value of a certain type. Optionals of any type can be set to nil,
not just object types.
You can think of an implicitly unwrapped optional as giving permission for the optional to
be unwrapped automatically whenever it is used. Rather than placing an exclamation
mark after the optional’s name each time you use it, you place an exclamation mark after
the optional’s type when you declare it.
NOT E
If you try to access an implicitly unwrapped optional when it does not contain a value, you will trigger a runtime
error. The result is exactly the same as if you place an exclamation mark after a normal optional that does
not contain a value.
You can still treat an implicitly unwrapped optional like a normal optional, to check if it
contains a value:
if assumedString {
println(assumedString)
You can also use an implicitly unwrapped optional with optional binding, to check and
unwrap its value in a single statement:
println(definiteString)
NOT E
Implicitly unwrapped optionals should not be used when there is a possibility of a variable becoming nil at a
later point. Always use a normal optional type if you need to check for a nil value during the lifetime of a
variable.
Assertions
Optionals enable you to check for values that may or may not exist, and to write code
that copes gracefully with the absence of a value. In some cases, however, it is simply
not possible for your code to continue execution if a value does not exist, or if a provided
value does not satisfy certain conditions. In these situations, you can trigger an assertion
in your code to end code execution and to provide an opportunity to debug the cause of
the absent or invalid value.
let age = -3
In this example, code execution will continue only if age >= 0 evaluates to true, that is, if
the value of age is non-negative. If the value of age is negative, as in the code above, then
age >= 0 evaluates to false, and the assertion is triggered, terminating the application.
Assertion messages cannot use string interpolation. The assertion message can be
omitted if desired, as in the following example:
assert(age >= 0)
NOT E
Assertions cause your app to terminate and are not a substitute for designing your code in such a way that
invalid conditions are unlikely to arise. Nonetheless, in situations where invalid conditions are possible, an
assertion is an effective way to ensure that such conditions are highlighted and noticed during development,
before your app is published.
Basic Operators
An operator is a special symbol or phrase that you use to check, change, or combine
values. For example, the addition operator (+) adds two numbers together (as in let i = 1 +
2). More complex examples include the logical AND operator && (as in if enteredDoorCode &&
passedRetinaScan) and the increment operator ++i, which is a shortcut to increase the value of
i by 1.
Swift supports most standard C operators and improves several capabilities to eliminate
common coding errors. The assignment operator (=) does not return a value, to prevent it
from being mistakenly used when the equal to operator (==) is intended. Arithmetic
operators (+, -, *, /, % and so forth) detect and disallow value overflow, to avoid
unexpected results when working with numbers that become larger or smaller than the
allowed value range of the type that stores them. You can opt in to value overflow
behavior by using Swift’s overflow operators, as described in Overflow Operators.
Unlike C, Swift lets you perform remainder (%) calculations on floating-point numbers.
Swift also provides two range operators (a..b and a...b) not found in C, as a shortcut for
expressing a range of values.
This chapter describes the common operators in Swift. Advanced Operators covers Swift’s
advanced operators, and describes how to define your own custom operators and
implement the standard operators for your own custom types.
Terminology
Operators are unary, binary, or ternary:
Unary operators operate on a single target (such as -a). Unary prefix operators
appear immediately before their target (such as !b), and unary postfix operators
appear immediately after their target (such as i++).
Binary operators operate on two targets (such as 2 + 3) and are infix because they
appear in between their two targets.
Ternary operators operate on three targets. Like C, Swift has only one ternary
operator, the ternary conditional operator (a ? b : c).
The values that operators affect are operands. In the expression 1 + 2, the + symbol is a
binary operator and its two operands are the values 1 and 2.
Assignment Operator
The assignment operator (a = b) initializes or updates the value of a with the value of b:
let b = 10
var a = 5
a=b
// a is now equal to 10
If the right side of the assignment is a tuple with multiple values, its elements can be
decomposed into multiple constants or variables at once:
Unlike the assignment operator in C and Objective-C, the assignment operator in Swift
does not itself return a value. The following statement is not valid:
if x = y {
This feature prevents the assignment operator (=) from being used by accident when the
equal to operator (==) is actually intended. By making if x = y invalid, Swift helps you to
avoid these kinds of errors in your code.
Arithmetic Operators
Swift supports the four standard arithmetic operators for all number types:
Addition (+)
Subtraction (-)
Multiplication (*)
Division (/)
Another Random Document on
Scribd Without Any Related Topics
object you name, it possesses existence. Consequently, He who is
supremely simple cannot think Himself; if He did, He would be
somewhere, (which is not the case). Therefore He does not think,
and He cannot be grasped by thought.
BEAUTY IS IMMORTAL.
They who join to this passion as much of a desire for immortality
as our mortal nature admits, seek beauty in the perpetuity of the
procreation which renders man imperishable. They determine to
procreate and produce beauty according to nature; procreating
because their object is perpetuity; and procreating beautifully
because they possess affinity with it. In fact, perpetuity does bear
affinity to beauty; perpetual nature is beauty itself; and such also
are all its derivatives.
LOVE IS A GADFLY.
Love, therefore, is similar to a gad-fly;140 needy by nature, it still
remains needy, whatever it may obtain; it could never be satisfied,
for this would be impossible for a being that is a mixture; no being
could ever be fully satisfied if by its nature it be incapable of
attaining fulness; even were it satisfied for a moment, it could not
retain anything if its nature made it continue to desire.
Consequently, on one side, Love is deprived of all resources141
because of its neediness; and on the other, it possesses the faculty
of acquisition, because of the reason that enters into its constitution.
QUESTIONS TO BE DISCUSSED.
1. Studying the origin of evils that might affect all beings in
general, or some one class in particular, it is reasonable to begin by
defining evil, from a consideration of its nature. That would be the
best way to discover whence it arises, where it resides, to whom it
may happen, and in general to decide if it be something real. Which
one of our faculties then can inform us of the nature of evil? This
question is not easy to solve, because there must be an analogy
between the knower and the known.157 The Intelligence and the
Soul may indeed cognize forms and fix their desires on them,
because they themselves are forms; but evil, which consists in the
absence of all goods, could not be described as a form.158 But
inasmuch as there can be but one single science, to embrace even
contraries, and as the evil is the contrary of the good, knowledge of
the good implies that of evil. Therefore, to determine the nature of
evil, we shall first have to determine that of good, for the higher
things must precede the lower, as some are forms and others are
not, being rather a privation of the good. Just in what sense evil is
the contrary of the good must also be determined; as for instance, if
the One be the first, and matter the last;159 or whether the One be
form, and matter be its absence. Of this further.160
NATURE OF EVIL.
3. As these are real beings, and as the first Principle is their
superior, evil could not exist in such beings, and still less in Him, who
is superior to them; for all these things are good. Evil then must be
located in non-being, and must, so to speak, be its form, referring to
the things that mingle with it, or have some community with it. This
"non-being," however, is not absolute non-being.166 Its difference
from being resembles the difference between being and movement
or rest; but only as its image, or something still more distant from
reality. Within this non-being are comprised all sense-objects, and all
their passive modifications; or, evil may be something still more
inferior, like their accident or principle, or one of the things that
contribute to its constitution. To gain some conception of evil it may
be represented by the contrast between measure and
incommensurability; between indetermination and its goal; between
lack of form and the creating principle of form; between lack and
self-sufficiency; as the perpetual unlimited and changeableness; as
passivity, insatiableness, and absolute poverty.167 Those are not the
mere accidents of evil, but its very essence; all of that can be
discovered when any part of evil is examined. The other objects,
when they participate in the evil and resemble it, become evil
without however being absolute Evil.
ebookbell.com