Вы находитесь на странице: 1из 304

32.973.2-018.

1
004.438
76

76

Swift. iOS. .: ,
2016. 304 .: . ( ).

ISBN 978-5-496-02256-9
Swift , ,
iOS-.
, , Apple 2.0, 2.1,
.
Swift
iOS-. , ,
. , , Swift,
iOS, OS X, tvOS watchOS.

12+ ( 29 2010 . 436-.)



32.973.2-018.1
004.438

.
.

ISBN 978-5-496-02256-9

, 2016
, 2016

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

I. Xcode . . . . . . . . . . . . . . . . . . . . . . . . 13
1. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1. Mac . . . . . . . . . . . . . . . . . . . . . 14
1.2. Apple- . . . . . . . . . . . . . 14
1.3. Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2. Xcode playground- . . . . . . . . 18
2.1. code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2. playground- . . . . . . . . . . . . . . . . . . . . . 21
2.3. playground- . . . . . . . . . . . . . . . . . . . . 23

II. Swift . . . . . . . . . . . . . . . . 27
3. . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.

. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.

29
. 31
34
35
37
39

4. . . . . . . . . . . 40
4.1. . . . . . . . . . . . . . . . . . . . . 40
4.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4
4.3.
4.4.
4.5.
4.6.

. .
. . . .
. . . . .
. . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

56
62
65
67

III. Swift . . . . . . . . . . . . . . . . . . 69
5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.1. . . . . . . . . . . . . . . . . . . . . . 70
5.2. . . . . . . . . . . . . . . . 72

6. . . . . . . . . . . . . . 78
6.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.2. . . . . . . . . . . . . . . . . 80

7. . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8. . . . . . . . . . . . 86
8.1.
8.2.
8.3.
8.4.

if . . . . . .
guard . . . . . . . . .
. . . .
switch

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

86
97
98
98

9. . . . . . . . . . . . . . . . . . . . . . . . 109
9.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

109
120
128

10. . . . . . . . . 135
10.1. for . . . . . . . . . . . . . . . . . . . . . . . .
10.2. while repeatwhile . . . . . . . . . .
10.3. . . . . . . . . . . . . . . . . . . . . . . . . . . .

135
142
144

11. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
11.1.
11.2.
11.3.
11.4.
11.5.
11.6.

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

148
151
162
163
164
165

12. . . . . . . . . . . . . . . . . . . . . . . . . . . 167
12.1. . . . . . . . . .
12.2. . . . . . . . .
12.3. . . .
12.4. . .
12.5. - . . . . . . . . .
12.6. . . . . . . . . . . . .
12.7. . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

167
170
171
172
174
175
176

IV. Swift . . . . . . . . . 178


13. . . . . . . . . . . . . . . . . . . . 180
13.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

180
182

14. . . . . . . . . . . . . . . . . . . . . . . . . 184
14.1. . . . . . . . . . . . . . .
14.2. . . . . . . . . . . .
14.3. switch . . . . . .
14.4.
14.5. . . . . . . . . . . . . .
14.6. . . . . . . . . . . . . . .
14.7. self . . . . . . . . . . . . . . . . . . . . . . .
14.8. . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

184
187
189
190
192
193
194
195

15. . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
15.1.
15.2.
15.3.
15.4.
15.5.

. .
. . . . . . . . .

. . .
. . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

199
200
202
203
204

16. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
16.1.
16.2.
16.3.
16.4.
16.5.

. . . . . . .
. . . . . . . .
. . . . . . . . .
. .
. . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

207
207
210
211
212

17. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
17.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17.2. . . . . . . . . . .
17.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

214
216
220

18. . . . . . . . . . . . . . . . . . . . . . . . . . . 223
18.1. . . . . . . . . . . . . . . . . . . . . . . . .
18.2. . . . . . . . . . . . . . . . . . . . . . . . . .

223
224

19. . . . . . . . . . . . . . . . . . . . . . . . . 229
19.1.
19.2.
19.3.
19.4.
19.5.

. . . . . . . . . . . . . . .
. .
final . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

229
231
234
235
235

20. Any AnyObject . . . . . . . . . . . 238


20.1. Any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20.2. AnyObject . . . . . . . . . . . . . . . . . . . . . . . . . . .

238
240

21. . . 241
21.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

241
248

22. ARC . . . . . . . . . . . 250


22.1. . . . . . . . . . . . . . . . . . . . . . . .
22.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22.3. . . . . . . . . . . . . . . . . . .

250
252
255

23. . . . . . . . . . . . . . . . 258
23.1. . . . . .
23.2. . . . . .
23.3. . . . . . .

258
260
261

24. . . . . . . . . . . . . . . . . . . . . . . . . . 262
24.1.
24.2.
24.3.
24.4.

. .
. . . . . .
. . . . . . . . . . . . .
. . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

263
264
265
266

25. . . . . . . . . . . . . . . . . . . . . . . . . . . 267
25.1. . . . . . . . . . .
25.2. . . . . . . . . . . .
25.3. . . . .
25.4.
25.5. . . . . . . .
25.6. . . . . . .
25.7. . . . . . . . . .
25.8. . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
.........

268
269
270
271
271
272
273
274

26.
. . . . . . . . . . . . . . . . . . . . . 275
27. . . . . . . . . . . . . . . 283
27.1.
27.2.
27.3.
27.4.
27.5.

. . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .

. . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

283
285
287
288
288

28. . . . . . . . . . . . . . . . . . . . . 291
28.1. . . . . . . . . . . . . . . . . . . . . . . . . . .
28.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28.3. . . . . . . . . . . . . . . . . .

291
292
297

29.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
29.1. . . . . . . . . . . . . . . . . . . . . . . . . . .
29.2. . . . . . . . . . . . . . . . . . . . .

298
301



Apple (Worldwide Developers Conference, WWDC) 2 2014
iOS-, , Swift.
: ,
,
Objective-C, iOS8 .
, Swift, , ,
. , , 8 2015 Apple
2.0,
iOS9. ,
, 2.1, .
- Objective-C, Swift , ,
1. Swift
, , Apple
. , Swift
Apple ,
(
iOS OS X)2.
Swift Objective-C
.
, , ,
Objective-C.
2
Swift
iOS OS X, watchOS (
Apple Watch) tvOS (
Apple TV 4- ).

.
1

Swift
Swift , , . , Swift
, C, Objective-C Java. Swift
, . .
, ,
Xcode ( , ) , . ,
!
Swift , :
-.
Swift - , .
, : .
, .

Swift , . ,
, , , , (
!) .
.

Swift
, . Swift : , . ,

, Swift
.
.

Swift , (

10

) C++1.
Swift -
.
Swift: ,

, .



.


( -, ,
). iOS
,
.
Swift
iOS- ( OS X-, watchOStvOS-). ,
,
. ,
. ,
iOS-, Swift. ,

App Store Mac App Store. , ,
iOS, OS X, tvOS watchOS.
Swift 2.1,
iOS 9.1 Xcode 7.1.
, ,
- .
, Apple
1


Primate Tabs Geekbench.

11

Swift, . ,
alkal@ya.ru.




?

iOS ( iPhone iPad), OS X, watchOS
tvOS?
?
.

.
.
, Swift (
Objective-C), . ,
iOS OS X.
, . , , , .

. Swift!
, ,
.
Xcode ( ).
: ,
! .


:
I. Xcode. Swift,

12

, . , Apple
ID, apple-,
Swift-, .
II. Swift.
Xcode,
, Swift.
, Swift, , .
III. Swift.
,
Swift. (, ) ,
, , (, ) ,
, .
IV. Swift.
Swift.
.


.
.

()

I
Xcode
,
Swift. , ,
Xcode,
.

, . Swift, http://swiftstub.com/,
Swift- .

Xcode,
( ). ,
,
.
, Xcode,
Swift,
.
99 1.
99 2. Xcode Playground-

1.1. Mac
Swift,
.
iMac, MacBook, Mac mini Mac Pro
Mavericks (OS X 10.9), Yosemite (OS X 10.10) El Capitan
(OS X 10.11). ,
Xcode Apple . ,
Swift , , ,

.
Windows OS X,
:
Mac OS X;
OS X ( Hackintosh);
Windows
OS X.
,
,
, Mac.

1.2. Apple-
Apple ID
Apple-.
https://developer.apple.com/register/
(.1.1).

1 15

. 1.1.
Apple ID , , Apple. ,
Apple ID. , , AppStore iCloud.com.

Apple ID,
Create Apple ID.
.
Apple ID,
( SignIn).

SDKs, Apple- (.1.2).
, , ,
.
.
, ( ).
99
iOS- (iOS Developer Program), Apple. ,

16 I. Xcode

. 1.2.

(
) App Store ( ) ,
.
, iOS-
Xcode.

1.3. Xcode
, , Xcode.
, (.1.3).
, Apple Xcode.
, Apple-.

View in the Mac App Store Mac App Store


Xcode.

1 17

. 1.3. Xcode

, . Xcode

Apple ID.
Xcode
Launchpad .

Xcode
playground-

2.1. code
Swift Xcode.
(Integrated Development
Environment, IDE) ,
().
:
;
/ ;
;
.

Xcode IDE, iOS OSX.


Xcode , . Xcode !
, , .
.2.1.

iOS OS X. Swift play
ground-. .
Xcode . - . Xcode
iOS SDK, , , .
iPhone, iPad, Apple Watch Apple TV. ,

2 Xcode playground- 19

. 2.1. Xcode

Xcode ( ).
,
Xcode, ,
. Xcode. , ,
(
install).
Xcode
.
, Xcode (.2.2).
:
. Xcode
.
, :
Get started with a playground playground-.
, , .
Create a new Xcode project iOS
OS X.

20 I. Xcode

. 2.2. Xcode
Check out an existing project

.
. , Xcode ,
. , .
/ .
.

Xcode 7, Swift,
playground-. Playground- ,
,
.
, .
, playground-! .2.3.
, playground-
Xcode,

2 Xcode playground- 21

. 2.3. playground-

. , playground-
, .
playground-
.

2.2. playground-
, . Playground- .
Get started with a playground
playground-. Xcode
playground-, ,
. :
iOS OS X. playground .
Part 1 Basics, iOS
Next.
;
playground- (.2.4).

22 I. Xcode

:
,
swift-.

.
, Xcode ,
, .

. 2.4. playground-

, str .
. ,
Swift.
"Hello, playground"
, , .2.5.

. 2.5.

, .
.

2 Xcode playground- 23

2.3. playground-
Playground- . 6.3
Xcode markdown- . .2.6 EditorShow Rendered Markup.
, , (.2.7).

. 2.6.

N times , N ,
, N .
.2.7.
.
swift- playground- Xcode.
Xcode ,
( Xcode ).
playground-

24 I. Xcode

. 2.7.

. 2.8. Xcode

,
(.2.8).
, ,
, .
. (, , , ..)
.

2 Xcode playground- 25

code, , .
, .
,
.
(.2.9).

. 2.9. playground-

(Debug Area). ,
View Debug Area Show Debug Area

.
.
Xcode 7
Assistant Editor.

, .

.
Swift
. Alt
(, str ),
, ,
, (.2.10).

26 I. Xcode

. 2.10.

Xcode playground- !
Swift. Swift , .

II

Swift
Swift .
,
Apple. , ,
,
Swift.
, Swift , (). , Swift
. .
,
, , , .
99 3.
99 4.

Swift, ,
, ( , ) . Swift .
, . ,
playground- Xcode.
,
. ( ), .
, . .
Swift : .
,
.
.
, () (.3.1).
, , , .
,
, .
, , ,
(.3.2).

3 29

,
.

. 3.1.

. 3.2.
,

,
, , , . ,
, ,
.

3.1.

,
, . Swift ,
. ,
, .
. ,
. :
: .
, -
, .

30 II. Swift

:
. .
(,
a). , (, !b), ,
(, i++). (, 1+6). .
.
, . Swift
a ? b : c.


(=) . a = b, a b.
,
( ).
Swift
, ( ).

, , ,
. Swift
.

, ( ). ,
,
(.3.3).
, , , (, ), ,
, ,
(, ).
.

3 31

. 3.3.

,
. , , ,
, :
=

, ( )
, , , .
Swift,
.

(, , ).

3.2.
. (), .
.
,
.

( ),

32 II. Swift

.
, . , ,
:
.
. ,
Swift, . Swift
var,
.

var _ = _
var , (
). , , .

3.1.
3.1
1 // var
2 var dragonsBox = " "

dragonsBox, " ".


:
dragonsBox " ".
.
,
. var
(3.2).
var
.

:
.

3 33
3.2
1
2
3
4

// var
var dragonsBox = " "
//
dragonsBox = " "

dragonsBox " ".


, ?
- ( ) .
Swift
( ) .
. let.

let _ = _
let , . ,
,
.

3.3.
3.3
1 // let
2 let dragonsBox = " "

dragonsBox, " ".


.
, , .
, .
Xcode
(3.4).

34 II. Swift
3.4
1 let dragonsBox = " "
2 dragonsBox = " " // :

, , , ,
. Swift

,
. , Xcode
,
, , .
,
.
. , .

, var let
. .
Swift
var let. :
var x = 0.1, y = 5
let a = 2, b = 7.1
.

Swift , , Objective-C,
.

3.3.

Swift ()
. , Unicode, ( !), :
. , -

3 35

( , , ..) ( )
. : myBestText,
theBestCountry, highScore.
Unicode- ( 3.5), .
3.5
1 //
2 var dw = "R"

,
.

, . .

, Swift - ,
(`),
, (3.6).
Swift var.
, .
3.6
1 // var
2 var `var` = " "

3 `var`

"
"
"
"

,
`var`.
, .

3.4.
, Xcode playground-
. (3.7).

36 II. Swift
3.7
1
2
3
4

//
var dragonsBox = " "
//
dragonsBox

" "
" "

( playground-
iOS)
( ). print().
, .
, . .
Swift ,
. .

print() 3.8.
3.8
1 // -
2 print(", !")

", !\n"

:
, !

, print().
, ,
(\n).
Xcode 6
: println() print(). , . Xcode 7 print() ,
println() print().
(\n).


, ( ),
3.9.

3 37
3.9
1
2
3
4

//
var dragonsBox = " "
//
print(dragonsBox)

" "
" \n"

gragonsBox print() ( ),
.

( ).

(),
. 3.10.
3.10
1
2
3
4

//
var dragonsBox = " "
//
print(" \(dragonsBox)")

(
).

3.5.
.
. ,
, .
Swift, ,
,
. Swift .

38 II. Swift

(// ) ,
(/* */). 3.11.
3.11
1 // -
2 /* 3
4 */

, ,
.
, playgound- markdown- . playground-
.
(//:),
. .3.4.

. 3.4. markdown-

, markdown ,
, Xcode Editor Show Rendered Markup.
.3.5.
markdown-
, EditorShow Raw Markup.

3 39

. 3.5. markdown-

3.6.
- , ,
,
(;). , , ,
.
, Swift
. ,
. 3.12.
3.12
1
2
3
4

// -
var number = 18
// -
number = 55; print(number)

Swift . ,
, . , .


, . (). ,
(),
. , ,
( ):
, , ,
.

, , , , , . Swift,
C, Objective-C, ,
( Apple, )
.
,
.

4.1.

. Swift ,
. 4.1.
4.1
1 //
2 var dragonsBox = " "

4 41

. , :
gragonBox
" ".

: Swift . , ,
, 4.1
:
gragonBox " ".
:
String gragonBox " ".
String , Swift -

.
. .
, Swift , .
()

. ,
, , .
4.2.
4.2
1
2
3
4
5
6

// dragonsBox
var dragonsBox: String
// trollsPot
var trollsPot = " "
// gragonsName
var dragonsName: String = " "

String ,
. dragonsBox
, trollsPot gragonsName .
. , -

42 II. Swift

, .
(4.3).
4.3
1 var newDragonsBox // :
Swift . , .
,
.

, (value type). -
Swift -, (reference type).
- .


,
, .
,
, .
(,
) ,
-
.
(, , ,
),
.
.

,
, ,
.
, ,
.

.

.

4 43

4.2.

, Swift
. ,
.


, , 81 18.
( , )
(
). Swift , .
.
,
, /
.

Int ( ) UInt
( ). 4.4.
4.4
1
2
3
4
5
6
7
8
9

//
var signedNum: Int
//
signedNum = -32
-32
/*


*/
var unsignedNum: UInt = 128
128


, N +N,
0 +2N, N
.

, Swift : Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64

44 II. Swift

UInt64. : 8-, 16-, 3264- .



( ),
. !

Swift:
.
, . , 2 .
( ) (
). ,
. , , .
Swift , , :
_. = 490
_.()
, , .

,
. ( )
,
.
min max. ,
,
(4.5).
4.5
1
2
3
4
5

// Int8
var minInt8 = Int8.min
// Int8
var maxInt8 = Int8.max
// UInt8

-128
127

4 45
6 var minUInt8 = UInt8.min
7 // UInt8
8 var maxUInt8 = UInt8.max

0
255

-
(), , ,
.
, .
, Apple Int UInt, .

, , Swift
. , .
.
playground- .

1. Int8
Uint8.
2. , Uint8,
, Int8. ,
.
3. .
4. ,
, .
.
5. .
6. ,
.
7. .
,
.

46 II. Swift


, Swift, , ,
. 3.14 -192.884022.
, , , .
, , : Float Double.
.
Float 32- ,
6 .
Double 64- ,
15 .
, ,
4.6.
4.6
1
2
3
4
5
6

// Float
var numFloat: Float = 104.3
104,3
// Double
let numDouble: Double
// Float
var someNumber = 8.36
8,36

, someNumber
( ).
Swift Double.

. ,
.

1. . Float ,
Float,
Double.
2. ,
.

4 47


, . , , . Swift
, .
. Swift :
+ (a + b).
.
+ ,
(+a).
.
.
- (a - b).
.
- ,
(-a). .

.
.

*
(a * b). -

.
/ (a / b).
.
%
. , ,
,
, , , (a % b).
.
++
,

48 II. Swift

(++a a++). ,
.
--
, (--a a--). , .
(
).
,
Double
(4.7).
4.7
1
2
3
4
5
6

//
var numOne = 19
var numTwo = 4
//
var numThree = 3.13
var numFour = 1.1

19
4
3.13
1.1

Int, Double.
,
. 4.8.
4.8
1 //
2 var numOne = 19
3 var numTwo = 4
4 //
5 var sum = numOne + numTwo
6 //
7 var diff = numOne - numTwo
8 //
9 var mult = numOne * numTwo
10 //
11 var qo = numOne / numTwo

23
15
76
4


. , . :

4 49

numOne, 19, numTwo,


4, 4? 4
numTwo 19.
4.75.
.
Int, ,
Int.
.
.
Xcode .


(4.9).
4.9
1 //
2 var numThree = 3.13
3 var numFour = 1.1
4 //
5 var sumD = numThree + numFour
6 //
7 var diffD = numThree - numFour
8 //
9 var multD = numThree * numFour
10 //
11 var qoD = numThree / numFour

4,23
2,03
3,443
2,84545454545455

Double.
Swift
.
. ( 4.10).
4.10
1
2
3
4
5
6
7

//
var numOne = 19
var numTwo = 4
//
var res1 = numOne % numTwo
var res2 = -numOne % numTwo
var res3 = numOne % -numTwo

19
4
3
-3
3

50 II. Swift

, .
:
numOne (numTwo * 4) = 3
19 (4 * 4) = 3
19 16 = 3
3 = 3

, numOne 4 numTwo, 3
, numTwo.
4
1

4
2

4
6

4
10

11

12

13

3
14

15

16

17

18

19

, .
. , ,
,
.
, (++) (--)
. 4.11.
4.11
1
2
3
4
5
6
7
8

//
var numOne = 19
//
numOne++
numOne
//
++numOne
numOne

19
19
20
21
21

:
numOne = numOne + 1

,
( ). :
()
, .

4 51
()

, .
numOne++ , , . Swift numOne , .
19. numOne
, .
(++numOne), , .
.


Swift , .
, ,
.
, Int Double , Xcode
.
Swift,
, .
.
, . ,
, ,
.
, .
,
,
.
init(),
Double :
Double.init()
,
. Swift
, :
Double()

52 II. Swift
,
.
,
.

Swift,
, :
Int()

Int.
Double()

Double.
Float()

Float.
UInt, Int8 ..
,
, .


(, , ). , :
( 4.12).
4.12
1
2
3
4
5
6
7

// Int
var numInt = 19
// Double
var numDouble = 3.13
//
var resD = Double(numInt) * numDouble
var resI = numInt * Int(numDouble)

19
3,13
59,47
57

:
Double Int
.
Int Double
.
, resD
, resI. ,
,
Double(), , Int()
Double.

4 53

, .


Swift .
, ,
, .
(+, -, *, /,
%) (=). 4.13,
,
.
4.13
1 // Int
2 var someNumInt = 19
3 //
4 someNumInt += 5
5 /*
6 someNumInt = someNumInt+5 */
7 //
8 someNumInt
9 //
10 someNumInt *= 3
11 /*
12 someNumInt = someNumInt*5 */
13 //
14 someNumInt
15 //
16 someNumInt -= 3
17 /*
18 someNumInt = someNumInt-5 */
19 //
20 someNumInt
21 //
22 someNumInt %= 8
23 /*
24 someNumInt = someNumInt%5 */
25 //
26 someNumInt

19
24

24
72

72
69

69
5

54 II. Swift

.
,
, .

( 4.14).
4.14
1
2
3
4
5

// Int
var someNumInt = 19
//
++someNumInt
//

6 someNumInt = someNumInt
7 //

8 someNumInt += 1



+ 1

19
20
21
22

someNumInt
.
. .

1. : Int,
Float Double. .
2. : Int
18, Float 16.4, Double 5.7. .
3. Float.
4.
Int. , .
5. Float
Double
Double.
6.
.

4 55


,
, , , ,
.
,
.
Swift :
. .
. 0b
.
.
0o .
. 0 .

. 4.15 17 .
4.15
1
2
3
4
5
6
7
8

// 17
let deciamlInteger = 17
// 17
let binaryInteger = 0b10001
// 17
let octalInteger = 0o21
// 17
let hexadecimalInteger = 0x11

17
17
17
17

,
17.
( )
( 0 ).
( ) .
.
e p .

56 II. Swift

:
1.25e2 1.25 * 102, 125.0.

:
0xFp-2 15 * 22, 3.75.
4.16 12.1875
.
4.16
1
2
3


4
5


6

//
let deciamlDouble = 12.1875
//
/*
exponentDouble = 1.21875*101 */
let exponentDouble = 1.21875e1
//
/*
hexadecimalDouble = 0xC.3*20 */
let hexadecimalDouble = 0xC.3p0

12,1875

12,1875

12,1875

,
.
.

()
( 4.17).
4.17
1 var number = 1_000_000

1000000

,
, .

.

4.3.
, Swift . :

4 57

,
?


Swift ,
:
Character .
String
.

, Unicode.
, ,
.
.
, ("").
Character.
(4.18).
4.18
1 var char: Character = "a"
2 char

"a"
"a"

char .
Character Xcode
.
Swift
String
Character.
, String .
.
Swift 2
String. , , Character.

58 II. Swift
String , ,
.
String.

String ( 4.19).
4.19
1 // String
2 var stringOne = "Dragon"

"Dragon"

,
String.
, , ,
, .


.

( 4.20).
4.20
1
2
3
4

//
var emptyString = ""
// String
var anotherEmptyString = String()

""
""

() .
, ,
String.
String ,
. ,
, ( 4.21).
4.21
1
2
3
4
5

//
var str: String
//
str = "Hello, Troll!"
str

"Hello, Troll!"
"Hello, Troll!"

4 59

str ,
.
, .


Swift String() , (
4.22).
4.22
1 //
2 var notEmptyString = String("Hello, Troll!") "Hello, Troll!"

notEmptyString
"Hello, Troll!".
String()
, ( 4.23).
4.23
1
2
3
4

// Double
var numDouble = 74.22
// , Double
var numString = String(numDouble)

74,22
"74.22"

String()
String. , Float(), Double() Int().


,
. :
.
,
,
( 4.24).
4.24
1 // String
2 var name = ""

""

60 II. Swift
3 // String c

4 let hello = ", \(name)!"

5 //
6 var meters: Double = 10
7 let text = " \(meters * 3.28) "

",
!"
10
" 32.8 "

hello
name . Swift.
print().
,
, .

( 4.25).
4.25
1
2
3
4
5
6
7

// String
let firstText = " "
// Double
var weight = 12.4
// String
let secondText = " "
//

8 var text = firstText + String(weight) +
secondText

" "
12,4
" "
" 12.4 "

.
weight ,
String().
Character String.


String characters.
Swift,
( 4.26).

4 61
4.26
1
2
3
4

// String
var str = "Hello, Troll!"
//
var collection = str.characters

"Hello, Troll!"
String.CharacterView

collection
.
Swift .
,
.
.
, ollection ( 4.27).
4.27
1 //
2 collection.count

13

str.
Xcode.
,
.

1. String .
2. Character, .
3. Int .
4. String , Character
Int, .
5. .

62 II. Swift

4.4.

. Swift
, Bool
: .
true, false.
( 4.28).
4.28
1
2
3
4

//
var isDragon = true
//
let isTroll: Bool = false

true
false

Swift, Bool , .
Swift Bool, , , , i = 1
i=true . Xcode .

Bool if
else,

( 4.29).
4.29
1
2
3
4
5
6
7
8

//
var isDragon = true
//
if isDragon {
print(", !")
}else{
print(", !")
}

true
", !\n"

:
, !

, , !,
. -

4 63

if-else , ,
.
isDragon false,
, !.


- . Swift
:
(!a);
(a && b);
(a || b).
. , true,
false, . !a
a ( 4.30).
4.30
1 var someBool = true
2 //
3 !someBool

true
false

someBool true.

someBool. .

. true, true.
false, false ( 4.31).
4.31
1
2
3
4
5

let firstBool = true, secondBool= true, thirdBool = false


//
var one = firstBool && secondBool
var two = firstBool && thirdBool
var three firstBool && secondBool && thirdBool

true
false
false

64 II. Swift

, .
, .

. true,
true. false, false ( 4.32).
4.32
1
2
3
4
5

let firstBool = true, secondBool= false, thirdBool = false


//
let one = firstBool || secondBool
let two = firstBool || thirdBool
let three secondBool || thirdBool

true
true
false

, .
,
( 4.33).
4.33
1 let firstBool = true, secondBool= false, thirdBool = false
2 var resultBool = firstBool && secondBool || thirdBool
3 var resultAnotherBool = thirdBool || firstBool && firstBool

false
true

Swift , ,
..
,
. Swift . , ,
(4.34).
4.34
1 let firstBool = true, secondBool= false, thirdBool = true
2 var resultBool = firstBool && (secondBool || thirdBool)
3 var resultAnotherBool = (secondBool ||
(firstBool && thirdBool)) && thirdBool

true
true

4 65

. , ,
.

1. .
true, false.
2. .
3. .
4. .
Xcode:
( ( true && false ) || true )
true && false && true || ( true || false )
false || ( false || true ) && ( true && false )

4.5.
Swift
. ,
.
typealias.
, ( 4.35).
4.35
1
2
3
4
5

// UInt8
typealias ageType = UInt8
/* UInt8,
*/
var myAge: ageType = 29

myAge ,
UInt8.
.
( 4.36).

66 II. Swift
4.36
1
2
3
4
5
6
7
8
9

// String
typealias textType = String
typealias wordType = String
typealias charType = String
//
var someText: textType = " "
var someWord: wordType = ""
var someChar: charType = ""
var someString: String = " String"

" "
""
""
" String"

String .
.
,
. ,
(4.37).
4.37
1
2
3
4
5

//
typealias ageType = UInt8
/*
UInt8 */
var maxAge = ageType.max

255

Swift
. . maxAge UInt8.
, .
typealias,
( ) ,
.
.

1. .
2. Double
.

4 67

3. Int
.
4. . :
= [] / []2

4.6.
Swift
. , Bool.
:
==

(a == b ) true ,
.
!=

(a != b) true,
.
>

(a > b) true,
.
<

(a < b) true,
.
>=

(a >= b) true,
.
<=

(a <= b) true,
.
, .
, , 4.38.

68 II. Swift
4.38
1 // "1 2"
2 1 > 2
3 // false,
4 // "2 2"
5 2 != 2
6 // false,
7 // "1 1 "
8 (1+1) < 3
9 // true,
10 // "5 1"
11 5 >= 1
12 // true,

false
false
true
true


.
Swift !
,
.

III

Swift
, Swift
. . ,
, : .
, ,
Swift,
!
99 5.
99 6.
99 7.
99 8. .
99 9.
99 10. .
99 11.
99 12.

, , (tuples),
, Swift.

5.1.

, . ,

.
, .

(_1, _2, ...)


,
.
.
, .
let = (_1, _2, ...)
var = (_1, _2, ...)
var,
let.

: , ( 5.1).

5 71
5.1
1 /* ,
2 ,
3
4 */
5 let myProgramStatus = (200, "In Work", true) (.0 200, .1 "In Work",

.2 true)
6 myProgramStatus
(.0 200, .1 "In Work",

.2 true)

myProgramStatus ,
,
:
200 Int;
"In work" String;
true Bool.
: Int, String Bool.
,
.


: ,
?

, .
(Int, String, Bool),
.
, , , (Bool,
String, Int) .
.
, ,
(5.2).
5.2
1 /*
2 */
3 let myProgramStatus: (Int, String,
Bool) = (200, "In Work", true)
4 myProgramStatus

(.0 200, .1 "In Work", .2 true)


(.0 200, .1 "In Work", .2 true)

72 III. Swift


, .

,
, . ,
( )
(5.3).
5.3
1
2
3
4

5
6
7

// Int
typealias numberType = Int
//
let numbersTuple: (Int, Int, numberType,
numberType)
//
numbersTuple = (0, 1, 2, 3)
numbersTuple

(.0 0, .1 1, .2 2, .3 3)
(.0 0, .1 1, .2 2, .3 3)

numberTuple , .

5.2.

, . Swift
.
.


, , var let,
()
(5.4).
5.4
1
2
3

//
let myProgramStatus = (200, "In Work", (.0 200, .1 "In Work",
true)
.2 true)
//

5 73
4
5
6
7
8

var (statusCode, statusText,


statusConnect) = myProgramStatus
//
print(" - \(statusCode)")
print(" - \(statusText)")
print(" - \
(statusConnect)")

" - 200\n"
" - In Work\n"
" - true\n"

- 200
- In Work
- true


, , ,

(5.5).
5.5
1
2
3
4
5
6

/*

*/
var (myName, myAge) = ("", 140)
//
print(" \(myName),
\(myAge) ")

" ,
140 \n"

:
, 140

myName myAge
("", 140).
. ,
, ,
.
5.6.
5.6
1
2

3
4
5
6
7

//
let myProgramStatus: (Int, String,
(.0 404, .1 "Error",
Bool) = (404, "Error", true)
.2 true)
/*
*/
var (statusCode, _, _) = myProgramStatus
//
print(" - \(statusCode)")
" - 404\n"

74 III. Swift

:
404

statusCode myProgramStatus.
.
Swift
. , . .



,
( 5.7).
5.7
1
2
3
4
5
6

//
let myProgramStatus: (Int, String, Bool) =
(200, "In Work", true)
//

print(" - \(myProgramStatus.0)")
print(" \(myProgramStatus.1)")
print(" \(myProgramStatus.2)")

(.0 200, .1 "In Work",


.2 true)
" - 200\n"
" - In
Work\n"
" true\n"

:
- 200
- In Work
- true


.
. . N
0, N 1.


,
.

5 75

. : ,
(5.8).
5.8
1

let myProgramStatus = (statusCode: 200,


statusText: "In Work", statusConnect: true)

(.0 200, .1 "In Work",


.2 true)

. , .
.
. 5.9
myProgramStatus.
5.9
1
2
3
4

//

print(" - \(myProgramStatus.
statusCode)")
print(" - \(myProgramStatus.
statusText)")
print(" - \
(myProgramStatus.2)")

" - 200\n"
" - In
Work\n"
" true\n"

:
200
- In Work
true

,
.
, myProgramStatus, ,
,
(5.10).
5.10
1
2
3
4

/*

*/
let myProgramStatus: (statusCode: Int,
statusText: String, statusConnect: Bool) =
(200, "In Work", true)

(.0 200, .1
"In Work", .2 true)

76 III. Swift
5 /*
6
7 */
8 myProgramStatus.statusCode
9 /*
10
11 */
12 let myNewProgramStatus = (statusCode: 404,
statusText:"Error", statusConnect:true)
13 /*
14
15 */
16 myNewProgramStatus.statusText

200

(.0 404, .1 "Error",


.2 true)

"Error"


( 5.11).
5.11
1
2
3
4
5
6
7

//
var myFirstTuple: (Int, String)
//
var mySecondTuple = (100, "")
//
myFirstTuple = mySecondTuple
myFirstTuple

(.0 100, .1 "")


(.0 100, .1 "")
(.0 100, .1 "")

myFirstTuple mySecondTuple , .
,
.
,
, (
5.12).
5.12
1
2
3
4
5
6

//
var someTuple: (200, true)
//
var someTuple.0 = 404
var someTuple.1 = false
someTuple

(.0 200, .1 true)

(.0 404, .1 false)

5 77

, , , , .
, , .
,

.
- (), , . IV .

1. : ,
.
.
2.
.
3. , , ( ).
4. ( ).
5. , ,
.


Swift, , ,

.

6.1.
, ,
, ,
,
.
- .
, String,
.
.

. ,
.
(x, y). . . , ,
,
. (, ..), ,
, .
. - Int, Int(). -

6 79


.
: , "1945"
, ", !"
(6.1).
6.1
1 //
2 let possibleString = "1945"
3 /*
4 */
5 let convertPossibleString = Int(possibleString)
6 //
7 let unpossibleString = ", !"

8 /*
9 */
10 let convertUnpossibleString = Int(unpossibleString)

"1945"
1 945
",
!"
nil

Int()
, ,
(Int ),
.

( , ).
Int Int?.
, Bool, String,
Float Double.
Swift , , nil ,
.
,
, nil. (6.2).
6.2
1
2
3
4
5

/* Int
*/
var dragonAge: Int? = 230
//
dragonAge = nil

230
nil

80 III. Swift

dragonAge
. ,
( Int ).
dragonAge , . nil,
dragonAge .
Swift nil . , , , Swift nil.

, Optional(), 6.3.
6.3
1
2
3
4
5
6

//
var optionalVar = Optional ("stringValue")
"stringValue"
optionalVar
"stringValue"
//
optionalVar = nil
nil
optionalVar
nil

Optional() String,
.

,
.

6.2.
, ,
, .


, : Int? Int, String? String, Bool? Bool
, , .

6 81

, . , Int?

(6.4).
6.4
1 /*
2 */
3 var trollAge: Int? = 95
5 trollAge = trollAge + 10 //

95

Swift , (forced
unwrapping).
(
) , Int? Int.

( ), .
, ,
(6.5).
6.5
1
2
3
4
5
6

/*
*/
var trollAge: Int? = 95
//
trollAge = trollAge! + 10
trollAge

95
105
105


trollAge Int, .
trollAge! + 10 ,

Int trollAge.
,
-
, nil. ,
Xcode .

82 III. Swift


Swift
(implicitly unwrapping).
,

nil,
, .
.
, (,
Int! Int?). 6.6
.
6.6
1
2
3
4
5
6
7
8
9

var type: String


//
let monsterOneType: String? = ""
""
type = monsterOneType!
""
type
""
//
let monsterTwoType: String! = ""
""
type = monsterTwoType
""
type
""

( nil)
Xcode (6.7).
6.7
1 let pointCoordinates: (Int, Int)? = nil
2 coordinates = pointCoordinates! //

.
, ,
,
.

Swift , ,
(assertions).
.
, .

assert(),
.
:
;
.
, assert() ,
. true,
; false, . Xcode,
, Xcode .
, :
, ,
.
(7.1).

84 III. Swift
7.1
1
2
3
4
5

6
7

/*
*/
var dragonAge = 230
//
assert( dragonAge >= 225, "
, " )
//
dragonAge

230

230

dragonAge >= 225. dragonAge 230,


.

dragonAge >= 235,
,
(.7.1).

. 7.1.


, ( 7.2).
7.2
1
2
3
4
5
6
7

/*
*/
var dragonAge = 230
//
assert( dragonAge >= 225 )
//
dragonAge

230

230

7 85

, true, ,
false. , assert()
, - .
( ) nil (7.3).
7.3
1
2
3
4

//
var isDragon: Bool? = true
//
assert( isDragon != nil, " " )

true

isDragon ( nil),
.
,
.
.

: ,
, . , :
, ..

. Swift , , , ,
,
.

Swift, . ,

.

8.1. if
if
, ,
. , ., ,

.
.

8 . 87

if _ {
//
}
if, . , .
.

.
, . Swift
Bool,
. , , , if, Bool.
8.1.
8.1
1
2
3
4
5
6

// Bool
var logicVar = true
//
if logicVar {
print(" logicVar ")
}

:
logicVar

if
logicVar. , ,
, ,
.
logicVar false,
print() .
, Swift .
true, false, .
, Xcode
(8.2).
8.2
1 var intVar = 1
2 if intVar { //
3
// ...
4 }

88 III. Swift


,
( 8.3).
8.3
1
2
3
4
5
6

// Bool
var logicVar = false
//
if !logicVar {
print(" logicVar ")
}

:
logicVar

logicVar
, if , .
if,
,
. Swift ,
. if.

if _ {
//
} else {
//
}
.
,
else.

8.4 if.
8.4
1
2
3
4
5

// Bool
var logicVar = false
//
if logicVar {
print(" logicVar ")

8 . 89
6 } else {
7
print(" logicVar ")
8 }

:
logicVar

.
, .
(8.5).
8.5
1
2
3
4
5
6
7
8
9

// Bool
var firstLogicVar = true
var secondLogicVar = false
//
if firstLogicVar || secondLogicVar {
print(" ")
} else {
print(" ")
}

true,
true, if
.
if
, if,
.

if _1 {
// ...
} else if _2 {
// ...
} else {
// ...
}
,
. -

90 III. Swift
. , .
else.
else if , else .

8.6 .
8.6
1 // Bool
2 var firstLogicVar = true
3 var secondLogicVar = true
4 //
5 if firstLogicVar && secondLogicVar {
6
print(" ")
7 } else if firstLogicVar || secondLogicVar {
8
print(" ")
9 } else {
10
print(" ")
11 }

, ,

. (|| )
, true, ( )
.

Bool. Swift . :
if . ,
.
, , .
, ,
:
5,
1000 .
5 7,
800 .

8 . 91
7,

500 .
, ,
if-else ( 8.7).

.
8.7
1 //
2 var tenantCount = 6
3 //
4 var rentPrice = 0
5 /*
6 */
7 if tenantCount < 5 {
8
rentPrice = 1000
9 } else if tenantCount >= 5 && tenantCount <= 7 {
10
rentPrice = 800
11 } else {
12
rentPrice = 500
13 }
14 //
15 var allPrice = rentPrice * tenantCount

6
0

800

4 800

.
.
if-else, rentPrice 800.
4800.


Swift
if .
.

_ ? 1 : 2
.
. .
.
.

92 III. Swift


8.8.
8.8
1
2
3
4
5

//
let a = 1
let b = 2
//
a <= b ? print("A B"):print("A B")

:
A

, .
, , . (8.9).
8.9
1
2
3
4
5
6
7
8

// Int
var height = 180
180
// Bool
var isHeader = true
true
//
let rowHeight = height + (isHeader ? 20 : 10 ) 200
//
rowHeight
200

, isHeader.
height rowHeight.

if
,
. , .
if ,
.

8 . 93

if-else
, ,
, , (8.10).
, trollsCount.
, .
, .
8.10
1 /*
2 */
3 var trollsCount: Int? = 8
4 //
5 if trollsCount == nil {
6
print(" ")
7 } else {
8
//
9
var potCountForTroll = 2
10
//
11
var allPotsCount = potCountForTroll * trollsCount!
12 }

2
10

assert(),

nil.
, allPotsCount
trollsCount.
,
nil, , nil .

if-else
. , . nil,
.
(optional
binding).

94 III. Swift

if var __ = _ {
1
} else {
2
}
var let.
( ).
if-else.
nil,
if . else,
, .
nil, , ( ),
if
. , .
,
. , . ,
( ), .
.

( 8.11).
8.11
1 /*
2 */
3 var monstersCount: Int? = 8
4 //
5 var monsters = 0
6 //
7 if var monsters = monstersCount {
8
print(" \(monsters) ")
9 } else {
10
print(" ")
11 }
12 monsters

8
0
" 8 \n"

:
8

, if, monstersCount,

8 . 95

,
monsters.
, monsters, , monsters,
, . ,
,
, . monsters ,
.
monstersCount ,
else.
Int(). ,
Int. , .
,
.
.
. ,
(, ,
) (
8.12).
8.12
1 /* String,
2
3 */
4 var coinsInNewChest = "140"
"140"
5 /* Int,
6
7 */
8 var allCoinsCount = 1301
1 301
9 //
10 if Int(coinsInNewChest) != nil{
11
allCoinsCount += Int(coinsInNewChest)!
1 441
12 } else {
13
print(" ")
14 }

Int() :
if nil coinsInNewChest.
allCoinsCount if.

96 III. Swift

,
.
, ,
.
Int(). 8.13.
8.13
1 /* String,
2
3 */
4 var coinsInNewChest = "140"
5 /* Int,
6
7 */
8 var allCoinsCount = 1301
9 /*
10 */
11 var coins = Int(coinsInNewChest)
12 /*
13 */
14 if coins != nil{
15
allCoinsCount += coins!
16 } else {
17
print(" ")
18 }

"140"

1 301
140

1 441

, : coins
( , )
,
.

,
, .
,
,
(8.14).
8.14
1 /* String,
2
3 */
4 var coinsInNewChest = "140"

"140"

8 . 97
5 /* Int,
6
7 */
8 var allCoinsCount = 1301
9 /*
10 */
11 if var coins = Int(coinsInNewChest){
12
allCoinsCount += coins
13 } else {
14
print(" ")
15 }

1 301

1 441

, , . , ,
, Swift

.

1. String Text.
2. Text.
, .
3. ,
, .
Int().
4. (numberOne: Text?, numberTwo:
Text?)? TupleType. .
5. TupleType, : ("190", "67"), ("100", nil) , ("-65", "70").
6. ,
nil.

8.2. guard
guard . if, . , ,
, , false.

98 III. Swift

guard else {
//
}
guard .
true, guard .
false, .
:
return, break, continue, throw (
).

8.3.
. Swift ,

(, 1, 2, 3, 4), (, 1 4).
(range operators).
Swift :
: a...b ,
a b ( a b). ,
1...4 1, 2, 3, 4.
: a..<b a b
( a). ,
2..<5 2, 3, 4.

.

8.4. switch

. ,
if,
else-if . -

8 . 99

.
Swift switch, ,
if,
. , switch
. .

switch
switch
if-else
( 8.15).
, .
8.15
1 /* Int
2 ,
3 */
4 var userMark = 4
5 /* if-else
6
7 userMark
8 */
9 if userMark == 1 {
10
print(" ! !")
11 } else if userMark == 2 {
12
print(" !")
13 } else if userMark == 3 {
14
print(" !")
15 } else if userMark == 4 {
16
print(", ")
17 } else if userMark == 5 {
18
print(" !")
19 }

:
,

if
, , true.
, switch,
,
.

100 III. Swift

switch _ {
case 1:
1
case 2, 3:
2
...
case M:
break
default:
N
}
switch, switch-case,

case.
case .
case ,
. ,
.
case , .
, ,
1. .
case , N- , default.
, , case. else if-else.
default switch-case.
switch-case ,
if-else .
case break,
.
, case default .
, case,
switch.
switch-case ,
.
default. , break.


switch-case ( 8.16).

8 . 101
8.16
1 /* Int
2 ,
3 */
4 var userMark = 4
5 /* if-else
6
7 userMark
8 */
9 switch userMark {
10
case 1:
11
print(" ! !")
12
case 2:
13
print(" !")
14
case 3:
15
print(" !")
16
case 4:
17
print(", ")
18
case 5:
19
print(" !")
20
default:
21
break
22 }

:
,

switch
userMark case
.
, switch-case .
switch Swift . , .

. , , case
( 8.17).
8.17
1 /* Int
2 ,
3 */
4 var userMark = 4

102 III. Swift


5 //
6 switch userMark {
7
case 1..<3:
8
print(" !")
9
case 3...5:
10
print(" !")
11
default:
12
assert(false, " \(userMark)

")
13 }

:
!

" !" , userMark 1 2.


" !".
default ,
1...5. , ,
userMark .

fallthrough
, , case, switch-case.
switch-case, case.
case fallthrough
( 8.18). ,
: , . ,
.
. , (
).
8.18
1 /* Character
2
3 */
4 var level: Character = ""
5 //

8 . 103
6 switch level {
7
case "":
8
print(" ")
9
fallthrough
10
case "":
11
print(" ")
12
fallthrough
13
case "":
14
print(" ")
15
default:
16
break
17 }

"" level ,
"" "", fallthrough, ,
"".

where
case ,
. case
. Swift case
, - . where case.
. .

:
1: 2 .
2: 2 .
3: 2 .
( ) . switch
.
, ,
if-else , ,

104 III. Swift

switch-case .
,
.
switch-case where (
8.19).
8.19
1 /* Float
2 */
3 var dragonWeight: Float = 2.4
4 /* Float
5 */
6 var dragonColor = ""
7 //
8 switch dragonColor {
9
case "" where dragonWeight < 2:
10
print(" 1")
11
case "" where dragonWeight < 2:
12
print(" 2")
13
case "", "" where dragonWeight >= 2:
14
print(" 3")
15
default:
16
break
17 }

:
3

where case , ,
true false.
case ,
where true.
where
switch .
case
.
(8.20).
8.20
1 var userMark = 4
2 switch userMark {
3
case _ where userMark>1 && userMark<3:

8 . 105
4
5
6
7
8
9 }

print(" !")
case _ where userMark >= 3:
print(" !")
default:
assert(false, " \(userMark)
")

:
!

case,
, where .

switch
switch
. ,
. Swift

switch-else . case , , , .

.

.
.
dragonColor dragonWeight ,
where .
(8.21).
8.21
1
2
3
4
5
6
7

/* (String, Int)
*/
var dragonCharacteristic = ("", 2.4)
//
switch dragonCharacteristic {
case ("", 0..<2):
print(" 1")

106 III. Swift


8
9
10
11
12
13
14 }

case ("", 0..<2):


print(" 2")
case ("", _), ("", _) where
dragonCharacteristic.1 > 2:
print(" 3")
default:
print(" ")

:
1

case
, ,
.
2 , (
) where.
switch ,
, ( ).
,
( )
where.
8.22.
8.22
1 /* (String, Int)
2 */
3 var dragonCharacteristic = ("", 2.4)
4 //
5 switch dragonCharacteristic {
6
case ("", 0..<2):
7
print(" 1")
8
case ("", 0..<2):
9
print(" 2")
10
case ("", let weight) where weight >= 2:
11
print(" 3")
12
case ("", let weight) where weight >= 2:
13
print(" 3")

8 . 107
14
15
16 }

default:
print(" ")

:
3

( 2 ), case :
, . ,
Swift
case. , :
case ("", let weight), ("", let weight) where weight >= 2:


case.
,
case, ,
, - , .
, 510
. case
.

-,
( 8.23).
8.23
1 /* (String, Int)
2 */
3 var dragonCharacteristic = ("", 2.4)
4 //
5 switch dragonCharacteristic {
6
case ("", 0..<2):
7
print(" 1")
8
case ("", 0..<2):
9
print(" 2")
10
case let(color, weight) where (color == "" || color ==
"") && weight >= 2:
11
print(" 3")
12
default:
13
print(" ")
14 }

108 III. Swift

:
3


, let ( var)
, . , , where ,
case.
String, ().

, . .

. switch . .

1. Operation , : operandOne,
operandTwo, operation.
. .
Character.
.
: +, -, *, /.
2. Operation
, (3.1, 33, "+").
3. switch-case,
, operation .
switch .
4.

switch-case.

. Swift : (array), (set)


(dictionary). .
,
.

9.1.

,
. ,
, .
,
.
-.
Int
.
. , 5 ,
0, 4. .
. ,
. Swift
,

110 III. Swift

. ,
.
,
.

[_1, _2, ...,_N]


, . .
.

, var let.
(
) let ,
var.
9.1.
9.1
1
2
3
4

//
let alphabetArray = ["a", "b", "c"]
//
var mutableArray = [2, 4, 8]

: alphabetArray mu
tableArray. alphabetArray
String, mutableArray
Int. .
0,1 2.
- (value type), -
(reference type). , ,
( 9.2).
9.2
1 //
2 let unmutableArray = ["one", "two", "three"]

3 //

["one", "two",
"three"]

9 111
4 var newArray = unmutableArray

5 newArray

6 //
7 newArray[1] = "four"
8 //
9 unmutableArray

["one", "two",
"three"]
["one", "two",
"three"]
"four"
["one", "two",
"three"]


.
.
,
,
, .


, ,
. , :
.
.
( 9.3).
9.3
1 /* ,
2 c */
3 let a1 = 1
4 let a2 = 2
5 let a3 = 3
6 if [1, 2, 3] == [a1, a2, a3] {
7
print(" ")
8 } else {
9
print(" ")
10 }

[a1, a2, a3] , , ,


.

112 III. Swift



, ( 9.4).
9.4
1
2
3
4
5
6
7

//
let alphabetArray = ["a", "b", "c"]
//
var mutableArray = [2, 4, 8]
//
alphabetArray[1]
mutableArray[2]

["a", "b", "c"]


[2, 4, 8]
"b"
8

, , . .


, ( 9.5).
9.5
1
2
3
4
5
6

//
var mutableArray = [2, 4, 8]
//
mutableArray[1] = 16
//
mutableArray

[2, 4, 8]
16
[2, 16, 8]

, ,
.
, .

( 9.6).
9.6
1 //
2 var mutableArray = ["one", "two", "three", "four"] ["one", "two",

"three", "four"]
3 //
4 var subArray = mutableArray[1...2]
["two", "three"]
5 /*

9 113
6 */
7 mutableArray[1...2] = ["five"]
8 mutableArray

["five"]
["one", "five",
"four"]

Swift .
[1...2] ["five"]
. "four" , [3], [2],
.

, .


, Swift
. .
(
).

:
var : Array<>
:
var : []
,
.
[] ( )
Array<>. .
( ).

,
. , .
,
, ( 9.7).

.

114 III. Swift


9.7
1 /* ,
2
3 */
4 var firstArray: [String] = ["x", "y", "z"]
5 //
6 var secondArray: Array<Int>
7 //
8 secondArray = [1, 2, 3, 4, 5]
9 //
10 firstArray
11 secondArray

["x", "y", "z"]

[1, 2, 3, 4, 5]
["x", "y", "z"]
[1, 2, 3, 4, 5]

Xcode
.


,
, - . :
[].

( Int() ), , [].
9.8.
9.8
1
2
3
4
5
6

/*
*/
var emptyArray: [String] = []
/*
*/
var anotherEmptyArray = [String]()

[]
[]

emptyArray another
Empty
Array, ( ), , .
[]() ,
.
count, -

9 115

, repeatedValue, ( 9.9).
9.9
1 /*
2 */
3 var alphaArray = [String?]( count: 5, repeatedValue: nil)
nil, nil, nil, nil]

[nil,

[String?], nil.
[nil, nil, nil, nil, nil] .
repeatedValue
.


,
, . , , .
:
, .

.
(+), 9.10.
9.10
1 //
2 let charsOne = ["a", "b", "c"]
3 let charsTwo = ["d", "e", "f"]
4 let charsThree = ["g", "h", "i"]
5 //
6 var alphabet = charsOne + charsTwo

7 //
8 alphabet += charsThree

10 alphabet[8]

["a", "b", "c"]


["d", "e", "f"]
["g", "h", "i"]
["a", "b", "c", "d", "e",
"f"]
["a", "b", "c", "d", "e",
"f", "g", "h", "i"]
"i"

116 III. Swift

alphabet
.



, . , , .
.
9.11.
9.11
1 var arrayOfArrays = [[1,2,3], [4,5,6], [7,8,9]]

, [Int]
. arrayOfArrays
[[Int]] (
).

( 9.12).
9.12
1
2
3
4
5

var arrayOfArrays = [[1,2,3], [4,5,6], [7,8,9]]


//
arrayOfArrays[2]
//
arrayOfArrays[2][1]

[7, 8, 9]
7

arrayOfArrays[2]
arrayOfArrays. arrayOfArrays[1][2],
, ,
arrayOfArrays.


. Swift, ,

.
count (
9.13).

9 117
9.13
1 var someArray = [1, 2, 3, 4, 5]
2 //
3 someArray.count

[1, 2, 3, 4, 5]
5

count , isEmpty true ( 9.14).


9.14
1 var someArray: [Int] = []
2 someArray.count
3 someArray.isEmpty

[]
0
true

count ,
( 9.15).
9.15
1
2
3

var someArray = [1, 2, 3, 4, 5]


[1, 2, 3, 4, 5]
//
var newArray = someArray[someArray.count-3... [3, 4, 5]
someArray.count-1]

suffix()
, . , ( 9.16).
9.16
1 var someArray = [1, 2, 3, 4, 5]
2 //
3 let subArray = someArray.suffix(3)

[1, 2, 3, 4, 5]
[3, 4, 5]

first last
( 9.17).
9.17
1
2
3
4
5

var someArray = [1, 2, 3, 4, 5]


//
someArray.first
//
someArray.last

[1, 2, 3, 4, 5]
1
5

append()
( 9.18).

118 III. Swift


9.18
1 var someArray = [1, 2, 3, 4, 5]
2 someArray.append(6)

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]

( ),
insert() ( 9.19).
9.19
1 var someArray = [1, 2, 3, 4, 5]
2 //
3 someArray.insert(100, atIndex: 2)

[1, 2, 3, 4, 5]
[1, 2, 100, 3,
4, 5]

,
.
, removeAtIndex() ,
removeFirst() removeLast() .
(9.20).
9.20
1 var someArray = [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
2 // ( 2)
3 someArray.removeAtIndex(2)
3
4 //
5 someArray.removeFirst()
1
6 //
7 someArray.removeLast()
5
8 /*
9 */
10 someArray
[2, 4]

. someArray
0 1.
( ), dropFirst() dropLast(),
,
.
, .
, ( 9.21).

9 119
9.21
1
2
3
4
5
6

let someArray = [1, 2, 3, 4, 5]


//
someArray.dropLast()
//
var newArray = someArray.dropFirst(3)
someArray

[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[4, 5]
[1, 2, 3, 4, 5]

someArray, , .
contains() Bool (9.22).
9.22
1
2
3
4

let intArray = [1, 2, 3, 4, 5, 6]


//
let resultTrue = intArray.contains(4)
let resultFalse = intArray.contains(10)

[1, 2, 3, 4, 5, 6]
true
false

indexOf() . , (9.23).
, nil.
9.23
1 let intArray = [1, 2, 3, 4, 5, 6, 4, 5, 6]

2 //
3 let result = intArray.indexOf(4)
4 let resultNIL = intArray.indexOf(99)

[1, 2, 3, 4, 5, 6,
4, 5, 6]
3
nil

4 intArray
3. 99 intArray ,
nil.

minElement() maxElement(). ,
(9.24).
9.24
1 let intArray = [3, 2, 4, 5, 6, 4, 7, 5, 6]

2 //

[3, 2, 4, 5, 6, 4, 7,
5, 6]

120 III. Swift


3 intArray.minElement()
4 //
5 intArray.maxElement()

2
7

, ,
.
. () .
hashValue .
:
var a: Float = 3.5
a.hashValue // 1 080 033 280
Swift Hashable.
, ,
.

, reverse(), 9.25.
9.25
1 var someArray = [1, 3, 5, 7, 9]
2 someArray.reverse()

[1, 3, 5, 7, 9]
ReverseRandomAccess
Collection<Array<Int>>

, reverse()
[Int], Reverse
Random
AccessCol
lec
tion. Swift. ,
,
.

9.2.

.
- ,
. ,

9 121

. , Swift
.
, .
, . - . , .
. ,
. 4 : "", "", ""
"" . ,
. ""
,
. ,
!
.
,
.

[_1, _2, ...,_N]


, . .
,
Hashable.

,
. , Swift
.
:
Set<>,
;
Set<>,
arrayLiteral,
.

122 III. Swift

Set<>.

, Set <>.
let,
var.

9.26 .
9.26
1 /* ,
2 */
3 var dishes: Set<String> = ["", "", {"", "",
"", ""]
"", ""}
4 /* ,
5 */
6 var dishesTwo: Set = ["", "",
{"", "",
"", ""]
"", ""}
7 /* ,
8
9 */
10 var members = Set<String>(arrayLiteral:
{"", " ",
"", " ", "")
""}
11 /* ,
12
13 */
14 var membersTwo = Set(arrayLiteral: "", {"", " ",
" ", "")
""}

members, membersTwo, dishes, dishesTwo


.


, , ,
[].

( 9.27).
9.27
1 //
2 var dishes: Set<String> = ["", ""]
3 //

{"", ""}

9 123
4 var members = Set<String>()
5 //
6 dishes = []

[]
[]


, - ,
, .
insert(),
( 9.28).
9.28
1
2
3
4

//
var musicStyleSet: Set<String> = []
//
musicStyleSet.insert("Jazz")

[]
"Jazz"

remove(),
nil, .
removeAll()
( 9.29).
9.29
1
2

3
4
5
6
7
8
9

//
var musicStyleSet: Set<String> =
["Jazz", "Hip-Hop", "Rock"]
//
musicStyleSet.remove("Hip-Hop")
musicStyleSet
//
musicStyleSet.remove("Classic")
//
musicStyleSet.removeAll()

{"Jazz", "Hip-Hop", "Rock"}


"Hip-Hop"
{"Jazz", "Rock"}
nil
[]


contains(). Bool ( 9.30).
9.30
1 //
2 var musicStyleSet: Set<String> = ["Jazz", "Hip-Hop", "Rock", "Funk"]
3 //

124 III. Swift


4 if musicStyleSet.contains("Funk") {
5
print(" ")
6 } else {
7
print(" , ")
8 }


.
, , . Swift

.
9.31
(.9.1). , , .
9.31
1
2
3
4
5
6

//
let evenDigits: Set = [0, 2, 4, 6, 8]
//
let oddDigits: Set = [1, 3, 5, 7, 9]
//
let differentDigits: Set = [3, 4, 7, 8]

, .

. 9.1.

9 125


(.9.2):
(intersect).
( )
(exclusiveOr).
(union).
, ,
, (subtract).

. 9.2. ,

intersect() , , ( 9.32).
9.32
1 var inter = differentDigits.intersect(oddDigits).sort()

[3, 7]

, intersect() sort().
sort()
, .
, ,
.

126 III. Swift


, , , , .
( ) .


exclusiveOr(), 9.33.
9.33
1 var exclusive = differentDigits.exclusiveOr
(oddDigits).sort()

[1, 4, 5, 8, 9]

union(), 9.34.
9.34
1 var union = evenDigits.union(oddDigits).sort()

[0, 1, 2, 3, 4,
5, 6, 7, 8, 9]

subtract() , ( 9.35).
9.35
1 var subtract = differentDigits.subtract(evenDigits).sort()

[3, 7]


.9.3 : aSet, bSet cSet. , . aSet
bSet,

. 9.3.

9 127

bSet. bSet ( )
aSet, bSet aSet. cSet bSet
, ,
aSet cSet , .
,
.
(==), 9.36.
9.36
1
2
3
4
5
6
7
8

//
var bSet: Set = [1, 3]
var copyOfBSet = bSet
/* bSet copyOfBSet
. */
if bSet == copyOfBSet {
print(" ")
}

, Set, .
isSubsetOf() ,
, bSet aSet ( 9.37).
9.37
1
2
3
4
5

var aSet: Set = [1, 2, 3, 4, 5]


var bSet: Set = [1, 3]
if bSet.isSubsetOf(aSet) {
print("bSet aSet")
}

:
bSet aSet

isSupersetOf() ,
( 9.38).
9.38
1
2
3
4
5

var aSet: Set = [1, 2, 3, 4, 5]


var bSet: Set = [1, 3]
if aSet.isSupersetOf(bSet) {
print("aSet bSet")
}

128 III. Swift

:
aSet bSet

isDisjointWith() ,
, true (
9.39).
9.39
1
2
3
4
5

var bSet: Set = [1, 3]


var cSet: Set = [6, 7, 8, 9]
if bSet.isDisjointWith(cSet) {
print(" bSet cSet ")
}

:
bSet cSet

isStrictSubsetOf() isStrictSupersetOf() , ,
( 9.40).
9.40
1
2
3
4
5
6
7
8

var aSet: Set = [1, 2, 3, 4, 5]


var bSet: Set = [1, 3]
if bSet.isStrictSubsetOf(aSet) {
print("bSet - aSet")
}
if aSet.isStrictSupersetOf(bSet) {
print("aSet - bSet")
}

:
bSet - aSet
aSet - bSet

9.3.


, .
,
, . -

9 129

( ),
, . .
String. , , , .

,
, .
,
, , ,
.
.

[_1:_1, _2:_2, ...,


_N:_N]
.
, .
, .
let,
var.

9.41.
9.41
1 var dictionary = ["one":"", "two":"", "three":""]

dictionary . one, two three


, .
, ,
String.
Xcode
.


, . ,

130 III. Swift

,
( 9.42).
9.42
1 var countryDict = ["RUS":"", "BEL":
"", "UKR":""]

2 //
3 countryDict["BEL"]
4 //
5 countryDict["RUS"] = " "

6 countryDict


["BEL": "",
"UKR": "",
"RUS": ""]
""
"
"
["BEL": "",
"UKR": "",
"RUS": "
"]

Swift .
countryDict
RUS.
updateValue(). 9.43,
( nil, ).
9.43
1 var countryDict = ["RUS":"", "BEL":
"", "UKR":""]

2 //
3 countryDict.updateValue(value: "
", forKey: "RUS")
4 countryDict


["BEL": "",
"UKR": "",
"RUS": ""]
""
["BEL": "",
"UKR": "",
"RUS": "
"]

updateValue forKey,
.

, .

9 131

, ,
( 9.44).
9.44
1 var countryDict = ["RUS":"", "BEL":
"", "UKR":""]

2 //
3 countryDict["TUR"] = ""
4 countryDict


["BEL": "",
"UKR": "",
"RUS": ""]
""
["BEL": "",
"UKR": "",
"RUS": "",
"TUR": ""]

( )
nil remo
veVa
lueForKey, ( 9.45).
9.45
1 var countryDict = ["RUS":"", "BEL":
"", "UKR":""]

2 //
3 countryDict["UKR"] = nil
4 countryDict.removeValueForKey("BEL")
5 countryDict

["BEL": "",
"UKR": "",
"RUS": ""]
nil
""
["RUS": ""]

removeValueForKey
.

, Swift nil .
,
( 9.46).
9.46
1 var countryDict = ["RUS":"
", "BEL":"", "UKR":""]


2 //
3 let myCountry: String = countryDict["RUS"]!

["BEL": "",
"UKR": "",
"RUS": "
"]
"
"

132 III. Swift

country
Dict["RUS"] String? String .


:
. , ,
, .

var _: Dictionary<:>
var _: [:]
[:] ( ) Dictionary<: >.
.

, , .


, . [:], ,
( 9.47).
9.47
1 var emptyDictionary: [String:Int] = [:]
[:]
2 var AnotherEmptyDictionary: Dictionary<String,Int> = [:]

[:]

[:] , (
9.48).
9.48
1 var countryDict = ["RUS":"
","BEL":"", "UKR":""]


2 countryDict = [:]
3 countryDict

["BEL": "",
"UKR": "",
"RUS": "
"]
[:]
[:]

9 133
,
. ,
. , , Swift ,
.


, ,
. .
.
count (
9.49).
9.49
1 var someDictionary = [1, 2, 3, 4, 5]
2 //
3 someDictionary.count

[1, 2, 3, 4, 5]
5

count , isEmpty true


(9.50).
9.50
1 var someDictionary: [Int] = []
2 someDictionary.count
3 someDictionary.isEmpty

[]
0
true


keys values ( 9.51).
9.51
1 var countryDict = ["RUS":"
["BEL": "",
", "BEL":"", "UKR":""] "UKR": "",

"RUS": "

"]
2 // countryDict
3 var keys = countryDict.keys
LazyMapCollection

<Dictionary<String,

String>, String>
4 // countryDict
5 var values = countryDict.values
LazyMapCollection

<Dictionary<String,

String>, String>

134 III. Swift

keys values Swift ,


, LazyMapCollection. , reverse()
. , , .

1. Chessman [String:(alp
ha:Character,num:Int)?].
.
, , , .
nil, ,
( ).
2. Chessmans Chessman ,
.
3. if-else, ,
( Chessmans), ,
.
4.
.
5. ,
.

10

, , , .
,
.
. Swift : for, while repeat
while. .
- ,
.
.

10.1. for
for .
Swift : for for-in.

for

for _; _; {
_
}
, for,
, .

:
1. _, .

136 III. Swift

2. _,
false , .
true, _, .
3. _ ,
, .
4. , 2.
C- , .
10.1.
10.1
1 for var i=0; i<5; i++ {
2
print(i)
3 }

(5 times)

:
0
1
2
3
4

for i,
0. i<5.
, , i .
i++, i .
.
, i<5,
. .
, i<5
false. .
:
0 4.
( for)
, , .
,
for ( 10.2).

10 . 137
10.2
1
2
3
4
5
6

var i = 0
for i; i<5; ++i {
i++
print(i)
}
i

0
(3 times)
(3 times)
6

:
1
3
5

i , for, .
for
(10.3).
10.3
1 var myArray = ["RUS", "UK", "USA"]
2 for var i = 0; i < myArray.count; i++ {
3
print(myArray[i])
4 }

["RUS", "UK", "USA"]


(3 times)

:
RUS
UK
USA

i .
0,
i, , 0.

count, .

.
, for ,
(10.4).
10.4
1 var mySports = ["Football": "",
"Polo":"", "Golf":""]

["Football":
"", "Golf":
"", "Polo":
""]

138 III. Swift


2 //
3 let mySportsArray = Array(mySports.keys)
["Football", "Golf",

"Polo"]
4 /*
5 */
6 for var i = 0; i < mySportsArray.count; i++ {
7
print(mySports[mySportsArray[i]]!)
(3 times)
8 }

,
,
.

for-in

for in {
_
}
for-in _ .
, . .
, _, .

for-in, for, .
.
10.5. 1 10
.
10.5
1
2
3
4
5

var totalSum = 0
for i in 1...10 {
totalSum += i
}
totalNum

0
(10 times)
55

10 . 139

for ,
i. 1...10, 1, .
i
. .
i, Swift
var.
, for-in,
.
,
( 10.6).
10.6
1
2
3
4
5
6
7

var totalNum = 0
var i = 0
for var i in 1...10 {
totalNum += i
}
totalNum
i

0
0
(10 times)
55
0

i , i .
for-in .
in ( 10.7).
10.7
1 var myMusicStyles = ["Rock", "Jazz", "Pop"]
2 for musicName in myMusicStyles {
3
print(" \(musicName)")
4 }

:
Rock
Jazz
Pop

musicName
, myMusicStyles.

140 III. Swift

,
, ?
( 10.8).
10.8
1

2
3
4

var countrysAndBlocks = ["": "", "": "",


"":""]
for (countryName, blockName) in countrysAndBlocks {
print("\(countryName) \(blockName)")
}

,
for, !
,
, .
, ,
( 10.9).
10.9
1

2
3
4

var countrysAndBlocks = ["": "", "": "",


"":""]
for (countryName, _) in countrysAndBlocks {
print(" \(countryName)")
}

.
Swift enumirate(), , forin
( 10.10).

10 . 141
10.10
1 var myMusicStyles = ["Rock", "Jazz", "Pop"]
2 for (index, musicName) in myMusicStyles.enumerate() {
3
print("\(index+1). \(musicName)")
4 }

:
1. Rock
2. Jazz
3. Pop

( String) ,
.
characters.
for-in. 10.11
String
.
10.11
1 let myName = "Troll"
2 for oneChar in myName.characters {
3
print(oneChar)
4 }

:
T
r
o
l
l

, . 10.12
,
.
,
, .
.
10.12
1
2

3

//
var resultsOfGames = ["Red Wings":["2:1","2:3"],
"Capitals":["3:6","5:5"],"Penguins":["3:3","1:2"]]
//

142 III. Swift


4 for (teamName, results) in resultsOfGames {
5 //
6
for oneResult in results {
7
print(" \(teamName) - \(oneResult)")
8
}
9 }

Capitals - 3:6
Capitals - 5:5
Red Wings - 2:1
Red Wings - 2:3
Penguins - 3:3
Penguins - 1:2

resultsOfGames Dictio
nary<String: Dictionary <String>>. teamName ,
for-in,

.

10.2. while
repeatwhile
while repeat while
, .
for if.

while

while {
_
}
while, .
. true, _. . .
, , false.
, , , .

10 . 143

while 10.13,
1 10 .
10.13
1 //
2 var i = 1
3 //
4 var resultSum = 0
5 //
6 while i <= 10 {
7
resultSum += i
8
i++
9 }
10 resultSum

1
0
(10 times)
(10 times)
55

i .
.
i ,
10, , ,
false, .
while ,
, .

repeat while
while repeat while
.
, .
Swift repeat while do while.

repeat {
_
} while
repeat, .
while .

repeat while 10.14,


1 10 .

144 III. Swift


10.14
1 //
2 var i = 1
3 //
4 var resultSum = 0
5 //
6 repeat{
7
resultSum += i
8
i++
9 } while i <= 10
10 resultSum

1
0
(10 times)
(10 times)
55

while repeat while ,


repeat while .
false,
.

10.3.
Swift, ,
, ,
break continue.

continue
continue ,
. 10.15 , 1
10, , .
10.15
1 for i in 1...10 {
2
if i%2 == 0 {
3
continue
4
} else {
5
print(i)
6
}
7 }

:
1
3
5
7
9

10 . 145

. ,
, .
continue.

break
break . . 10.16
1 10. 5,
.
10.16
1 import Foundation
2 for i in 1...10 {
3
var randNum = Int(arc4random_uniform(10))
4
if randNum == 5 {
5
print(" \(i)")
6
break
7
}
8 }

:
7

, , .
Foundation,
arc4random_uniform(),
. import, Xcode
, arc4random_uniform() . Uint32 0
UInt32.
UInt32, Int .

, .

146 III. Swift

,
, Swift
( 10.17).
10.17
1 mainLoop: for i in 1...5 {
2
for y in i...5 {
3
if y == 4 && i == 2{
4
break mainLoop
5
}
6
print("\(i) - \(y)")
7
}
8 }

:
1
1
1
1
1
2
2

1
2
3
4
5
2
3

,
.
,
break continue .
1
, . .
1. ,
.
, ,
.
[String:[String:UInt]].

. , .

10 . 147

2.
.
2
9, if-else, .
,

, , Chessmans.

11


. Swift.
.
, .
. Swift. ,
. - Swift
, , .

11.1.
, .
.
,
.

func (_) ->


{
_
}
func, . , ,
,, , , .

11 149

.
. :
func myFirstFunc


.

, . , , , . ,
.
( ). :
func myFirstFunc
(someValue: Int, anotherValue: String)

(->),
. ,
. :
func myFirstFunc
(someValue: Int, anotherValue: String)
-> String

:
func myFirstFunc
(someValue: Int, anotherValue: String)
-> [(String,Int)?]


. - ,
return,
.
return . :
func myFirstFunc
(someValue: Int, anotherValue: String)
-> String {
return String(someValue) + anotherValue
}

150 III. Swift


. ,
.
:
func myFirstFunc (someValue: Int) -> String {
return String(someValue)
}

, . ,
.
(11.1).
11.1
1
2
3
4
5

func printMessage() -> Void {


print(" ")
}
//
printMessage()

printMessage(),
. printMessage()
- .
.
,
Void. C- .
Void
, , . :
func printMessage() -> () {
print(" ")
}

, , .
:

11 151
func printMessage() {
print(" ")
}

11.2.


.
.
, , , (3,14)
. . ,
.
.


, , ( 11.2). ,
.
11.2
1
2
3
4
5
6

func printCodeMessage(requestCode: Int) -> () {


print(" - \(requestCode)")
}
//
printCodeMessage(200)
printCodeMessage(404)

:
200
404

printCodeMessage()
requestCode. .

152 III. Swift


.
. ,
.
, ,
. 11.3 ,
,
.
11.3
1 func sum(a:Int, b: Int, c:Int) -> () {
2
print(" - \(a+b+c)")
3 }
4 sum(10, b: 51, c: 92)

:
- 153

a ,
.
,
.
, , Xcode, .
.

Swift, .

, (11.4).
11.4
1 func sum(a:Int, _ b: Int, c:Int) -> () {
2
print(" - \(a+b+c)")
3 }
4 sum(15, 12, c: 9)

:
- 36

11 153

, b
.


. .
var
, , ( 11.5).
11.5
1 func generateString(code: Int, var _ text: String)
2 -> String {
3
text += String(code)
4
return text
5 }
6 generateString(200, ":")

":200"

generateString() text.
var ,
, .

. .


,
, ,
.
,
.
, inout.
, ,
.
(& ), ,
. 11.6
.

154 III. Swift


11.6
1
2
3
4
5
6
7
8
9

func changeValues(inout a: Int, inout _ b: Int) -> () {


let tmp = a
a = b
b = tmp
}
var a = 150, b = 45
changeValues(&a, &b)
a
b

45
150

:
200
404

: a b.
,
.
. , .


. , -
,

(11.7).
11.7
1
2

3
4
5
6

func generateString(code: Int, message: String) -> String {


let returnMessage = " "\(message)"
\(code)"
return returnMessage
}
//
print(generateString(200, message: " "))

:
" " 200

11 155

generateString() String.
return .
print()
String, .
,
,
print() .


, .
, , .

(...) .
.
11.8. ,
.
, .
,
.
11.8
1
2
3
4
5
6
7
8
9

func printRequestString(codes: Int...) -> () {


var codesString = ""
for oneCode in codes {
codesString += String(oneCode) + " "
}
print(" - \(codesString)")
}
printRequestString(600, 800, 301)
printRequestString(101, 200)

:
- 600 800 301
- 101 200

codes
. ,
for-in.

156 III. Swift

.
.


, .
. 11.9
, , .
11.9
1 func getCodeDescription(code: Int) -> (Int, String){
2
let description: String
3
switch code {
4
case 1...100:
5
description = "Error"
6
case 101...200:
7
description = "Correct"
8
default:
9
description = "Unknown"
10
}
11
return (code, description)
12 }
13 print(getCodeDescription(150))

:
(150, "Correct")

getCodeDescrip
tion() , : .
getCodeDescription() ,
, (
11.10).
11.10
1 func getCodeDescription(code: Int)
2 -> (code: Int, description: String){
3
let description: String
4
switch code {
5
case 1...100:

11 157
6
description = "Error"
7
case 101...200:
8
description = "Correct"
9
default:
10
description = "Unknown"
11
}
12
return (code, description)
13 }
14 let request = getCodeDescription(48)
15 request.description
16 request.code

"Error"

(.0 45, .1 "Error")


(.0 45, .1 "Error")
"Error"
45

getCodeDescription()
request,
description code, .
,
. , .
: 50 5000 . ,
( 11.11).
11.11
1 func sumWallet( wallet: [Int] ) -> Int {
(2 times)
2
var sum = 0
3
for oneBanknote in wallet {
4
sum += oneBanknote
(19 times)
5
}
6
return sum
(2 times)
7 }
8 //
9 var wallet = [50, 100, 100, 500, 50, 1000, [50, 100, 100, 500, 50,
5000, 50, 100]
1 000, 5 000, 50, 100]
10 //
11 sumWallet(wallet)
6 950
12 //
13 wallet.append(1000)
[50, 100, 100, 500,

50, 1 000, 5 000, 50,

100, 1 000]
14 //
15 sumWallet(wallet)
7 950

sumWallet()
-.
Int, .

158 III. Swift


, , ,
- .
sumWallet() , -
( 11.12).
11.12
1 func sumWallet( wallet: [Int]? = nil ) -> Int? {
2
var sum = 0
3
if wallet == nil {
4
return nil
5
}
6
for oneBanknote in wallet! {
7
sum += oneBanknote
8
}
9
return sum
10 }
11 //
12 var wallet = [50, 100, 100, 500, 50, 1000, [50, 100, 100, 500,
5000, 50, 100]
50, 1 000, 5 000, 50,

100]
13 //
14 sumWallet(wallet)
6 950
15 sumWallet()
nil

,
. .
wallet [Int] [Int]?.
. ,
, , ,
,
Int.
nil.
wallet ,
.
. ,
wallet (
nil), nil.

11 159

, wallet , if. return,


nil.
return.
.


,
, .
(
11.13).
11.13
1 func sumWallet(banknotsArray wallet: [Int]? = nil ) ->
Int? {
2
var sum = 0
3
if wallet == nil {
4
return nil
5
}
6
for oneBanknote in wallet! {
7
sum += oneBanknote
8
}
9
return sum
10 }
11 //
12 sumWallet(banknotsArray: [50, 100, 100, 500, 50, 1000, 6 950
5000, 50, 100])

wallet banknotsArray,
sumWallet()
, .
,
. , ,
.


Swift ! ? ,
.

160 III. Swift


, :
() -> ()
,
,
:
([Int]) -> (String,String)?
, .


, .
, ,
. , , .
,
.
. generateWallet(),
. .
sumWallet() , , generateWallet(), (11.14).
11.14
1 import Foundation
2 //
3 func generateWallet(walletLength: Int)
4 -> [Int] {
5
//
6
let typesOfBanknotes = [50, 100, 500, 1000, 5000]
7
//
8
var wallet: [Int] = []
9
//
10
for _ in 1...walletLength {
11
let randomIndex = Int( arc4random_uniform(

UInt32( typesOfBanknotes.count-1 ) ) )
12
wallet.append( typesOfBanknotes[randomIndex] )
13
}
14
return wallet
15 }
16 //

11 161
17 func sumWallet(banknotsFunction wallet: (Int)->([Int]) )
18 -> Int? {
19
//
20
let myWalletArray = wallet( Int( arc4random_uniform(10) ) )
21
var sum: Int = 0
22
for oneBanknote in myWalletArray {
23
sum += oneBanknote
24
}
25
return sum
26 }
27 //
28 sumWallet(banknotsFunction: generateWallet)
2 700

, , ,
.
arc4random_uniform(), .
generateWallet() ,
. typesOfBanknotes
. :
typesOfBanknotes, - wallet,
.
for .
.
, . ,
.
wallet sumWallet()
generateWallet(). sumWallet() .
, , .
, , :
func someFunction(_:Int) -> () {}
someFunction(100)


, , -

162 III. Swift

. 11.15
.
11.15
1 //
2 func printText()
3 -> (String) {
4
return " "
5 }
6 // ,
7 func returnPrintTextFunction()
8 -> () -> (String) {
9
return printText
10 }
11
12 let newFunctionInLet = returnPrintTextFunction()
13 newFunctionInLet()

() -> String
"
"

returnPrintTextFunction()
() -> (String).
printText().
newFunc
tionInLet () -> (String),
, . ,
(.11.1).

. 11.1. ,

11.3.

. -

11 163

, .

. .
( 11.16).
11.16
1 //
2 let functionInLet = {return true}
3 functionInLet()

true

() -> Bool
.
,
.
- , ,
. .
-, .
:
let trueFunc = {return true}
let anotherTrueFunc = trueFunc
trueFunc anotherTrueFunc .

11.4.
, , .
,
. ,
. .
. .
,
,
( 11.17).
11.17
1 func oneStep(var coordinates: (Int, Int), stepType: String ) ->
(Int,Int) {
2
func up(inout coords: (Int, Int)) -> (Int,Int) {
3
return (coords.0+1, coords.1)

164 III. Swift


4
}
5
func right(inout coords: (Int, Int)) -> (Int,Int) {
6
return (coords.0, coords.1+1)
7
}
8
func down(inout coords: (Int, Int)) -> (Int,Int) {
9
return (coords.0-1, coords.1)
10
}
11
func left(inout coords: (Int, Int)) -> (Int,Int) {
12
return (coords.0, coords.1-1)
13
}
14
15
switch stepType {
16
case "up":
17
return up(&coordinates)
18
case "right":
19
return right(&coordinates)
20
case "down":
21
return down(&coordinates)
22
case "left":
23
return left(&coordinates)
24
default:
25
return (0, 0)
26
}
27 }
28 var coordinates = (10, -5)
(.0 10, .1 -5)
29 coordinates = oneStep(coordinates, stepType: "up") (.0 11, .1 -5)
30 oneStep(coordinates, stepType: "right")
(.0 11, .1 -4)

oneStep() .
, stepType.
oneStep().

11.5.
Swift (overloading) . ,

.

. 11.18 ,
.
11.18
1 func say(what: String){}
2 func say(what: Int){}

11 165

say(),
. ,
.
(
),
. 11.19.
.
11.19
1
2
3
4
5
6

func cry()
return
}
func cry()
return
}

-> String {
"one"
-> Int {
1


( 11.20).
11.20
1 let resultOfFunc = say()

Swift , ,
, .
Xcode .
- ,
,
(11.21).
11.21
1 let resultString: String = say()
2 let resultInt = say() + 100

11.6.
. . ,
. ,
,

166 III. Swift

.
.
11.22.
11.22
1 func countdown(firstNum num: Int) {
2
print(num)
3
if num > 0 {
4
//
5
countdown(num -1)
6
}
7 }
8 countdown(20)

,
firstNum .
.
1
2 . , Chessmans, chessAnalizer().

, Chessmans.
2
,
Chessmans. Chessmans ( ),
, ( String )
(
(Character, Int)?).

. ,
, .

12

. .
Apple Swift, (closures)
,
.
, . .
,
.
,
( C Objective-C), - .

12.1.
,
:
;

;
.
.

, - ( 12.1).
12.1
1 //
2 func handle100(wallet: [Int]) -> [Int] {
3
var returnWallet = [Int]()

168 III. Swift


4
for banknot in wallet {
5
if banknot==100{
6
returnWallet.append(banknot)
7
}
8
}
9
return returnWallet
10 }
11 //
12 var wallet = [10,50,100,100,5000,100,50,50,500,100]
13 handle100(wallet)

handle100()
. handle100() ,
:
;
;
( ,
).
,
1000 (12.2).
12.2
1 func handleMore1000(wallet: [Int]) -> [Int] {
2
var returnWallet = [Int]()
3
for banknot in wallet {
4
if banknot>=1000{
5
returnWallet.append(banknot)
6
}
7
}
8
return returnWallet
9 }
10 var wallet = [10,50,100,100,5000,100,50,50,500,100]
11 handleMore1000(wallet)

, .
handle100() handleMore1000() . .
:
1. .
, .

12 169

2.
, . , .
,
. ( 12.3).
12.3
1 //
2 func handle(wallet: [Int], closure: (Int) -> Bool) -> [Int] {
3
var returnWallet = [Int]()
4
for banknot in wallet {
5
if closure(banknot) {
6
returnWallet.append(banknot)
7
}
8
}
9
return returnWallet
10 }
11 // 100
12 func compare100(banknot: Int) ->Bool {
13
return banknot==100
14 }
15 // 1000
16 func compareMore1000(banknot:Int) -> Bool {
17
return banknot>=1000
18 }
19 var wallet = [10,50,100,100,5000,100,50,50,500,100]
20 handle(wallet, closure: compare100)
21 handle(wallet, closure: compareMore1000)

handle() closure
if . Bool
.
,
handle()
.
,
.

170 III. Swift

12.2.
, ( ,
1000 , ,
100, ..).
. ,
, ,
, .
.
,
.

{ (_) -> in
__
}
.
in,
.

.
handle(), ( 12.4).
12.4
1
2
3
4
5
6
7
8

// 1000
handle(wallet, closure: {(banknot: Int) -> Bool in
return banknot>=1000
})
// 100
handle(wallet, closure: {(banknot: Int) -> Bool in
return banknot==100
})

compare100()
compareMore1000() ,
closure.
.

12 171

, , - , .
,
.


. closure handle() (
(Int) -> Bool),

( 12.5).
12.5
1
2
3
4
5
6
7
8

// 1000
handle(wallet, closure: {banknot in
return banknot>=1000
})
// 100
handle(wallet, closure: {banknot in
return banknot==100
})

in
,
wallet.
handle closure
banknot
.

12.3.
. Swift, .
,
( return),
. , return
(12.6).

172 III. Swift


12.6
1
2
3
4
5
6

// 1000
handle(wallet,
closure: {banknot in banknot>=1000})
// 100
handle(wallet,
closure: {banknot in banknot==100})

,
.

12.4.
. Swift
.
$_.
.
$0 .
$1, $2 ..

handle()
( 12.7).
12.7
1
2
3
4
5
6

// 1000
handle(wallet,
closure: {$0>=1000})
// 100
handle(wallet,
closure: {$0==100})

$0 banknot - closure handle().


, - ,
.

12 173

- (
handle(), closure ), Swift
( )
( 12.8).
12.8
1
2
3
4
5
6

// 1000
handle(wallet)
{$0>=1000}
// 100
handle(wallet)
{$0==100}

, , , ,
,
. 12.9 wallet, , ,
successbanknots, . , wallet
, successbanknot.
12.9
1 let successbanknot = [100, 500]
2 handle(wallet)
3 {banknot in
4
for number in successbanknot {
5
if number == banknot {
6
return true
7
}
8
}
9
return false
10 }

success
banknot ,
successbanknot,
. Swift
.

174 III. Swift

12.5. -
, ,
. , .
,
.
12.10,
closure ,
.
12.10
1 let closure : () -> () = {
2
print(" ")
3 }
4 closure()


, () -> ().
,
, .
(
),
.
: , ,
..
($0, $1 ..), 12.11.
12.11
1 var sum: (numOne: Int, numTwo:Int) -> Int = {
2
return $0 + $1
3 }
4 sum(numOne: 10, numTwo: 34)

, sum, Int .

12 175
,
. , .
.

12.6.
Swift, ( ),
.
( 12.12). ,
,
. ,
.
12.12
1
2
3
4
5
6
7
8
9

var a = 1
var b = 2
let closureSum : () -> Int = {
return a+b
}
closureSum()
a = 3
b = 4
closureSum()

, closureSum,
a b. .
, .
, ,
.
, , in.
closureSum
, a b ( 12.13).

176 III. Swift


12.13
1 var a = 1
2 var b = 2
3 let closureSum : () -> Int = {
4
[a,b] in
5
return a+b
6 }
7 closureSum()
8 a = 3
9 b = 4
10 closureSum()

, closureSum,
a b. .

12.7.
Swift , . sort(), ( , ).
, , .

, sort(),

Bool .
, . 12.14
myArray , . sort()
, true,
.
12.14
1 var array = [1,44,81,4,277,50,101,51,8]
2 array.sort({ (first: Int, second: Int) -> Bool in
3 return first < second
4 })

12 177
;
.

, 12.15.
,
myArray ,
. sort() , true,
.
12.15
1 var array = [1,44,81,4,277,50,101,51,8]
2 var sortedArray = array.sort({$0<$1})

.
Swift , , Bool.
. .
,
,
(12.16).
12.16
1 var array = [1,44,81,4,277,50,101,51,8]
2 var sortedArray = array.sort(<)

, Swift!

IV

Swift
Swift .
,
. , .
, , ,
.
Swift ,
( )
. , , , Swift .
: (enum), (struct) (class).
? ? . ,
. , , ,
, , ..
, -
, .
99 13.
99 14.
99 15.
99 16.

Swift 179
99 17.
99 18.
99 19.
99 20. Any AnyObject
99 21.
99 22. ARC
99 23.
99 24.
99 25.
99 26.

99 27.
99 28.
99 29.

13

- Swift.

.
, Swift.
, .
,
, , .
, , : , . , .
Swift
Pascal, Visual Basic, Python, PHP ..

13.1.
, : .
, .
( ) .
, . Apple Swift.
,
. , , Swift
.

13 181

, Automobile ().
.
- , , .
Automobile ,
(.13.1).

. 13.1.

, , ( )
. bmw
Automobile, ,
BMW.
. Automobile : , , ,
, .. . bmw
:
a.brand = "BMW"
a.type = "3"
a.maxSpeed = 210
a.engineCapacity = 1499

182 IV. Swift

,
, :
.
, . , , ,
. Automobile
: , , :
a.startEngine()
a.accelerate()
a.beep()

, , .
.
- ().

. ,
Swift
.

13.2.
(namespaces) .


. ,
.

.
.
. , ,
. ,
.

13 183

, . .
,
. - .
, ,
, . .
, , ,
: import Foundation.
Cocoas Foundation Framework
, .
: , UIKit,
iOS-, Cocoas Foundation Framework.

14

.
.
Swift.

14.1.
, .
, ,
.
,
( 14.1).
,
String. .
14.1
1 var russianCurrency: String = "Rouble"

, ,
, -

,
. ,
?
(
14.2). , .
.

14 185
14.2
1 var currencyUnit: [String] = ["Rouble", "Dollar", "Euro"]
2 var russianCurrency = currencyUnit[0]

.
, .

(, , ),
. , , , , Apple Swift.
.
, . ,

.

enum {
case 1
case 2
...
}
enum,
. , ,
.
. .
case,
. .
.
, .


( 14.3). .
,
.

186 IV. Swift


14.3
1 enum CurrencyUnit {
2
case Rouble
3
case Dollar
4
case Euro
5 }


(14.4).
14.4
1 enum CurrencyUnit {
2
case Rouble, Dollar, Euro
3 }

CurrencyUnit
, - . , .

, , .
.
var = .
,
.
let :
= .
. .

,
( 14.5).
14.5
1
2
3
4
5

// 1
let roubleCurrency = CurrencyUnit.Rouble
// 2
let dollarCurrency: CurrencyUnit
dollarCurrency = .Dollar

Rouble
Dollar

CurrencyUnit,
CurrencyUnit.

14 187
- , String Int. currency1
currency2 :
var currency1 = CurrencyUnit.Rouble
var currency2 = "Rouble"
Swift Enum Value.

14.2.

, .
, ,
, .

.
CurrencyUnit,
, , , (14.6).
14.6
1 enum CurrencyUnit {
2
case Rouble(ountrys: [String], shortName: String)
3
case Dollar(ountrys: [String], shortName: String)
4
case Euro(ountrys: [String], shortName: String)
5 }

countrys , , : , .
, Cur
rencyUnit,
( 14.7).
14.7
1 var roubleCurrency: CurrencyUnit
2 roubleCurrency = .Rouble(ountrys:
["Russia"], shortName: "RUB")

Rouble(["Russia"], "RUB")

roubleCurrency Rouble . -

188 IV. Swift

.
.
,
Dollar. , : , , .. ,
.
Dollar, ,
( 14.8).
14.8
1 // ,
2 enum DollarCountrys {
3
case USA
4
case Canada
5
case Australia
6 }
7 // ""
8 enum CurrencyUnit {
9
case Rouble(ountrys: [String], shortName: String)
10
case Dollar(ountrys: [String], shortName: String, national:
DollarCountrys)
11
case Euro(ountrys: [String], shortName: String)
12 }
13 var dollarCurrency: CurrencyUnit
14 dollarCurrency = .Dollar(ountrys: ["USA"], Dollar(["USA"], "USD",
shortName: "USD", national: .USA)
DollarCountrys.USA)

national CurrencyUnit
DollarCountrys. , .
DollarCountrys
CurrencyUnit ,
( 14.9).
14.9
1 // ""
2 enum CurrencyUnit {
3
// ,
4
enum DollarCountrys {
5
case USA
6
case Canada
7
case Australia
8
}

14 189
9
10

11
12 }

case Rouble(ountrys: [String], shortName: String)


case Dollar(ountrys: [String], shortName: String, national:
DollarCountrys)
case Euro(ountrys: [String], shortName: String)

DollarCountrys
. , , .
,
CurrencyUnit ( 14.10).
14.10
1 var someVar: CurrencyUnit.DollarCountrys
2 someVar = .Australia

Australia

DollarCountrys CurrencyUnit,
, .
, Swift .
DollarCountrys CurrencyUnit
, Xcode
.

14.3. switch
.
switch.
14.11, , ,
.
14.11
1
2

3
4
5
6

//
var someCurrency = CurrencyUnit.Rouble(ountrys: ["Russia",
"Ukrain", "Belarus"], shortName: "RUB")
//
switch someCurrency {
case .Rouble(let countrys, let shortname):
print(". : \(String(countrys)),
: \(shortname)")

190 IV. Swift


7
8

9
10

11 }

case let .Euro (countrys, shortname):


print(". : \(String(countrys)),
: \(shortname)")
case .Dollar(let countrys, let shortname, let national):
print(" \(national). : \(String(countrys)),
: \(shortname) ")

:
. : ["Russia", "Ukrain", "Belarus"], : RUB

switch Currency
Unit, default .
.

, let
case ( Euro).

14.4.


(, String, Character Int).
.
, .
.



, ( 14.12).
14.12
1 enum Smile: String {
2
case Joy = ":)"
3
case Laugh = ":D"
4
case Sorrow = ":("
5
case Suprise = "o_O"
6 }

14 191

Smiles .
String.
.
,
.

.
.

Int,

(
0). , , . , 14.13 ,

.
14.13
1 enum Planet: Int {
2
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus,
Neptune, Pluton = 999
3 }

1. , : Venus 2,
Earth 3 ..
Pluton , 999.


.
rawValue. Smile
( 14.14).

192 IV. Swift


14.14
1 var iAmHappy = Smile.Joy
2 iAmHappy.rawValue

Joy
":)"

rawValue
Joy String.


rawValue
, .

(14.15).
,
. Planet.
14.15
1 var myPlanet = Planet.init(rawValue: 3)
2 var anotherPlanet = Planet.init(rawValue: 11)

Earth
nil

init() Planet. ,
. , init()
, .
init() , , nil.
- , .
, ,
, .
,
.
init().
, .
.

14.5.
,
. -

14 193

( ) .
. Swift.
,
,
. Swift
: -, .
.

.

,
.
(14.16). Smile
,
.
14.16
1
2
3
4
5
6
7
8
9

enum Smile: String {


case Joy = ":)"
case Laugh = ":D"
case Sorrow = ":("
case Suprise = "o_O"
var description: String {return self.rawValue}
}
var mySmile: Smile = .Sorrow
mySmile.description

(var).
( let) .

14.6.
- init().
,

194 IV. Swift

, .
, , .
Smile ,
( 14.17).
14.17
1 enum Smile: String {
2
case joy = ":)"
3
case laugh = ":D"
4
case sorrow = ":("
5
case suprise = "o_O"
6
//
7
func description(){
8
print(" :

")
9
}
10 }
11 var mySmile = Smile.joy
12 mySmile.description()

:
:

description().
descrip
tion() .

14.7. self
- , .
self,
.
. ,
,
. Smile ( 14.18).

14 195
14.18
1 enum Smile: String {
2
case joy = ":)"
3
case laugh = ":D"
4
case sorrow = ":("
5
case suprise = "o_O"
6
func description(){
7
print(" :

")
8
}
9
func descriptionValue() -> Smile{
10
return self
11
}
12
func descriptionRawValue() -> String{
13
return self.rawValue
14
}
15 }
16 var mySmile = Smile.joy
joy
17 mySmile.descriptionValue()
joy
18 mySmile.descriptionRawValue()
":)"

descriptionValue() self ,
. Smile ,
.
descriptionRawValue()
self.

switch self {},
.
self ,
. .

14.8.
,
. ,
.
.

196 IV. Swift

, , : , , . ,

(14.19). : .
14.19
1 enum ArithmeticExpression{
2
//
3
case Addition(Int, Int)
4
//
5
case Substraction(Int, Int)
6 }
7 var expr = ArithmeticExpression.Addition(10, 14)

Addition(10, 14)

.
Swift , , .
.
expr Arithme
ticExpression, .
-
.
, ( 14.20).
14.20
1 enum ArithmeticExpression{
2
case Addition(Int, Int)
3
case Substraction(Int, Int)
4
//
5
func evaluate() -> Int {
6
switch self{
7
case .Addition(let left, let right):
8
return left + right
9
case .Substraction(let left, let right):
10
return left - right
11
}
12
}
13 }
14 var expr = ArithmeticExpression.Addition(10, 14) Addition(10, 14)
15 expr.evaluate()
24

14 197

evaluate()
.
switch self. , ,

.
,
: : 1 + 5, 6 + 19 .. ,
: 1 + (5 7), 6 5 + 4 ..,

.

ArithmeticExpression ,
Int, . , , ,
. . indirect, :
enum ;
case , .
14.21.
, : , ?
, . 20 + 10 34.
14.21
1 enum ArithmeticExpression {
2
case Number(Int)
3
indirect case Addition(ArithmeticExpression,

ArithmeticExpression)
4
indirect case Subtraction(ArithmeticExpression,

ArithmeticExpression)
5
func evaluate( var expression: ArithmeticExpression? =

nil ) -> Int{
6
expression = (expression == nil ? self : expression)
7
switch expression! {
8
case .Number( let value ):
9
return value

198 IV. Swift


10
case .Addition( let valueLeft, let valueRight ):
11
return self.evaluate( valueLeft ) +

self.evaluate( valueRight )
12
case .Subtraction( let valueLeft, let valueRight ):
13
return self.evaluate( valueLeft )
self.evaluate( valueRight )
14
}
15
}
16 }
17 var expr = ArithmeticExpression.Addition( .Number(20),
.Subtraction( .Number(10), .Number(34) ) )
18 expr.evaluate()
-4

Number . . indirect,
ArithmeticExpression .
evaluate
ArithmeticExpression?.
, , .
:
expr.evaluate(expr)

, .
switch, , ,
,
.

, .
Swift ,
. ,
,
. .

ArithmeticExpression ,
, , ,
.

15

. .
, . ,
.
, .

( ).

15.1.
, .
, ()
.
.

( 15.1).
.
15.1
1 var playerInChess = (name: "", wins: 10)

, , , ,
. ,
, .

200 IV. Swift

, , ,
( ).
,
, . , Int .

struct {
//
}
struct, . , : .
.
, .

, (15.2).
15.2
1 struct PlayerInChess {}
2 var oleg: PlayerInChess

, .

15.2.

PlayerInChess ,
- .
( 15.3).
,
. :

15 201
struct {
var 1:
let 2:
// ...
}
.
Swift .
15.3
1 struct PlayerInChess {
2
var name: String
3
var wins: UInt
4 }

name wins
.
, , , .
,
( 15.4).
15.4
1 var oleg = PlayerInChess(name: "", wins: 32)

PlayerInChess,
.
. ! -
, Xcode .


. Swift
,
.

(.15.1).
,
: ,
, , ,

202 IV. Swift

. ,
- , .

. 15.1.


, .
,
. Swift
.
PlayerInChess (
15.5).
15.5
1
2
3
4
5
6

struct PlayerInChess {
var name = ""
var wins: UInt = 0
}
var oleg = PlayerInChess(name: "", wins: 32)
var maks = PlayerInChess()

PlayerInChess
PlayerInChess

PlayerInChess.
, name wins .

15.3.
,
. .
PlayerInChess
. ,
,
.

15 203


( 15.6).
15.6
1
2
3
4
5
6
7
8

struct PlayerInChess {
var name: String
var wins: UInt = 0
}
var oleg = PlayerInChess(name: "")
//
oleg.name
oleg.wins = 20

,
.

15.4.
, init().
,
, .
.

:
. ,
,
,
.
func. ,
.
PlayerInChess, name ( 15.7).
15.7
1 struct PlayerInChess {
2
var name: String
3
var wins: UInt = 0

204 IV. Swift


4
init(name: String){
5
self.name = name
6
}
7 }
8 var oleg = PlayerInChess(name: "")

.
name, .

self.
wins , .
,
, .
, ,
. , , var.
-. . :
var olegMuhin = PlayerInChess(name: "asd")
var olegLapin = olegMuhin

15.5.

.

. , ,
.
self.
,
( 15.8).
15.8
1 struct PlayerInChess {
2
var name: String
3
var wins: UInt

15 205
4
func description(){
5
print(" \(self.name) \(self.wins) ")
6
}
7 }
8 var oleg = PlayerInChess(name: "", wins: 15)
9 oleg.description()

:
15


, , , .
,
mutating.
,
. , , ,
(15.9).
15.9
1 struct PlayerInChess {
2
var name: String
3
var wins: UInt
4 // , wins
5 mutating func addWins( countOfWins: Int ){
6 self.wins += countOfWins
7 }
8 }
9 var oleg = PlayerInChess(name: "", wins: 15)
10 oleg.wins
11 oleg.addWins(3)
12 oleg.wins
,
.

16

.
. , , ,
.
Swift.
,
:
. -.
, .
.
, (var ),
(let ).
mutating
.
.
. , (sets),
, :
( ) . , ,
.
. init(){},
.
. Swift
, .

16 207
.


.
.

: , , .
,
.

16.1.
. .

class {
//
}
class,
. .
,
, .

.

16.2.
. ,
, . ,
. .
.
, ,
. ,

208 IV. Swift


. , ,
,
.
, .
,

.
( -) .
:
;
;
.
, . Unicode , .
.
, ,
. ,
(nil).
: , (16.1).
16.1
1 class Chessman {
2
let type: String
3
let color: String
4
var coordinates: (String, Int)? = nil
5
let figureSymbol: Character
6
init(type: String, color: String, figure: Character){
7
self.type = type
8
self.color = color
9
self.figureSymbol = figure
10
}
11 }
12 var kingWhite = Chessman(type: "king", color: "white", figure: "")

16 209


. coordinate
. ,
. .
, .
,
. , , ( nil).
type color . : ,
( 16.2).
Chessman. ,
.
16.2
1 //
2 enum ChessmanType {
3
case King
4
case Castle
5
case Bishop
6
case Pawn
7
case Knight
8
case Queen
9 }
10 //
11 enum CheesmanColor {
12
case Black
13
case White
14 }
15 class Chessman {
16
let type: ChessmanType
17
let color: CheesmanColor
18
var coordinates: (String, Int)? = nil
19
let figureSymbol: Character
20
init(type: ChessmanType, color: CheesmanColor, figure:

Character){
21
self.type = type
22
self.color = color
23
self.figureSymbol = figure
24
}
25 }
26 var kingWhite = Chessman(type: .King, color: .White, figure: "")

210 IV. Swift

ChessmanType CheesmanColor String.



.

16.3.
. .
, . ,
,
.
, , , .
, mutating , .
, ( 16.3). Cheesman :
(
).
(
).
16.3
1 class Chessman {
2
let type: ChessmanType
3
let color: CheesmanColor
4
var coordinates: (String, Int)? = nil
5
let figureSymbol: Character
6
init(type: ChessmanType, color: CheesmanColor,

figure: Character){
7
self.type = type
8
self.color = color
9
self.figureSymbol = figure
10
}
11
//
12
func setCoordinates(char c:String, num n: Int){
13
self.coordinates = (c, n)
14
}

16 211
15
// ,
16
func kill(){
17
self.coordinates = nil
18
}
19 }
20 var kingWhite = Chessman(type: .King, color: .White, figure: "")
21 kingWhite.setCoordinates(char: "E", num: 1)

E1.

. .

16.4.

, .
,
.
. Chessman
.
. ,
( 16.4).
16.4
1 class Chessman {
2
let type: ChessmanType
3
let color: CheesmanColor
4
var coordinates: (String, Int)? = nil
5
let figureSymbol: Character
6
init(type: ChessmanType, color: CheesmanColor, figure:

Character){
7
self.type = type
8
self.color = color
9
self.figureSymbol = figure
10
}
11
init(type: ChessmanType, color: CheesmanColor, figure:

Character, coordinates: (String, Int)){
12
self.type = type
13
self.color = color
14
self.figureSymbol = figure

212 IV. Swift


15
self.setCoordinates(char: coordinates.0, num:

coordinates.1)
16
}
17
func setCoordinates(char c:String, num n: Int){
18
self.coordinates = (c, n)
19
}
20
func kill(){
21
self.coordinates = nil
22
}
23 }
24 var QueenBlack = Chessman(type: .Queen, color: .Black, figure:
"", coordinates: ("A", 6))

setCoordina
tes(),
.

,
Chessman.

, , .

16.5.
, ,
. ,
CheesmanColor ChessmanType, Chessman.

, , .
,
, ( 16.5).
16.5
1 class Chessman {
2
enum ChessmanType {
3
case King
4
case Castle
5
case Bishop
6
case Pawn
7
case Knight

16 213
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 }

case Queen
}
enum CheesmanColor {
case Black
case White
}
let type: ChessmanType
let color: CheesmanColor
var coordinates: (String, Int)? = nil
let figureSymbol: Character
init(type: ChessmanType, color: CheesmanColor, figure:
Character){
self.type = type
self.color = color
self.figureSymbol = figure
}
init(type: ChessmanType, color: CheesmanColor, figure:
Character, coordinates: (String, Int)){
self.type = type
self.color = color
self.figureSymbol = figure
self.setCoordinates(char: coordinates.0, num:
coordinates.1)
}
func setCoordinates(char c:String, num n: Int){
self.coordinates = (c, n)
}
func kill(){
self.coordinates = nil
}

CheesmanColor ChessmanType Chessman.


.
,
( 16.6).
ChessmanType,
Chessman.
16.6
1 var linkToEnumType = Chessman.ChessmanType.Bishop

17

Swift .
, .

17.1.
,
. , .

:
.
,
.


,
. :
,
.
,
. .
.
.

17 215


. , ,
.

lazy var 1
lazy let 2
lazy, .

. ,
, (
17.1).
17.1
1 class AboutMan{
2
let firstName = ""
3
let secondName = ""
4
lazy var wholeName: String = self.generateWholeName()
5
func generateWholeName() -> String{
6
return self.firstName + " " + self.secondName
7
}
8 }
9 var Me = AboutMan()
10 Me.wholeName

AboutMan . wholeName ,
.
nil, .
, . , .

, - .
,
.
,
.

216 IV. Swift


,
.
,
.

var 1: { __ }
(var).
, .
, return.

. wholeName() AboutMan
wholeName,

. (17.2).
17.2
1
2
3
4

5
6
7

class AboutMan{
let firstName = ""
let secondName = ""
var wholeName: String {return self.firstName + " " +
self.secondName}
}
var Me = AboutMan()
Me.wholeName

wholeName
.

17.2.

17 217
(get) -

.
(set)
.

, ,
. ,
, , .

var 1: {
get {
_
}
set (_) {
_
}
}
. get set ,
.

.
return.
.
, . set().
,
, .
set
. .
. : , . .

( 17.3).

218 IV. Swift


17.3
1 struct Circle{
2
var coordinates: (x: Int, y: Int)
3
var radius: Float
4
var perimeter: Float {
5
get{
6
return 2.0*3.14*self.radius
7
}
8
set(newPerimeter){
9
self.radius = newPerimeter / (2*3.14)
10
}
11
}
12 }
13 var myNewCircle = Circle(coordinates: (0,0), radius: 10)
14 myNewCircle.perimeter // 62.8
15 myNewCircle.perimeter = 31.4
16 myNewCircle.radius
// 5

perimeter
, radius. perimeter
, radius.
,
.
newValue.
, Circle 17.4.
17.4
1 struct Circle{
2
var coordinates: (x: Int, y: Int)
3
var radius: Float
4
var perimeter: Float {
5
get{
6
return 2.0*3.14*self.radius
7
}
8
set{
9
self.radius = newValue / (2*3.14)
10
}
11
}
12 }



. ,

17 219

.
,
Swift .
(observers).
,
,
.
:
willSet .
didSet .

var 1: {
willSet (){
_
}
didSet (){
_
}
}
willSet didSet, . willSet
, didSet ,
.


,
( , ). willSet newValue,
didSet oldValue.
. ,
, ,
( 17.5).
17.5
1 struct Circle{
2
var coordinates: (x: Int, y: Int)
3
var radius: Float {
4
willSet (newValueOfRadius) {
5
print(" \(self.radius)

\(newValueOfRadius)")

220 IV. Swift


6
}
7
didSet (oldValueOfRadius) {
8
print(" \(oldValueOfRadius)

\(self.radius)")
9
}
10
}
11
var perimeter: Float {
12
get{
13
return 2.0*3.14*self.radius
14
}
15
set{
16
self.radius = newValue / (2*3.14)
17
}
18
}
19 }
20 var myNewCircle = Circle(coordinates: (0,0), radius: 10)
21 myNewCircle.perimeter // 62.8
22 myNewCircle.perimeter = 31.4
23 myNewCircle.radius // 5

:
10.0 5.0
10.0 5.0

.
perimeter radius,
.

17.3.
, , . , ,

.
, .
.
,
, .
, .

17 221

,
.

. ,
, .
,
lazy.

, .

struct SomeStructure {
static var storedTypeProperty = "Some value"
static var computedTypeProperty: Int {
return 1
}
}
enum SomeEnumiration{
static var storedTypeProperty = "Some value"
static var computedTypeProperty: Int {
return 2
}
}
class SomeClass{
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 3
}
class var overrideableComputedTypeProperty: Int {
return 4
}
}
static
. class
,
. , , .

(
17.6). AudioChannel ,
:

.
.

222 IV. Swift


17.6
1 struct AudioChannel {
2
static var maxVolume = 5
3
var volume: Int {
4
didSet {
5
if volume > AudioChannel.maxVolume {
6
volume = AudioChannel.maxVolume
7
}
8
}
9
}
10 }
11 var LeftChannel = AudioChannel(volume: 2)
12 var RightChannel = AudioChannel(volume: 3)
13 RightChannel.volume = 6
14 RightChannel.volume
// 5
15 AudioChannel.maxVolume // 5
16 AudioChannel.maxVolume = 10
17 AudioChannel.maxVolume // 10
18 RightChannel.volume = 8
19 RightChannel.volume
// 8

AudioChannel :
. volume 6,
maxVolume.
,
, .

18

,
.
. .

18.1.
,
.
, Chessboard,
. Chessboard
desk:
var desk: Chessboard


, .
, :
desk.getCellInfo("A", 5)

,
:
desk["A", 5]
.

224 IV. Swift

16.2.
- .
,
.

subscript(_) > __ {
get{
//
}
set(_){
//
}
}

subscript. ( , )
. ,
. ( ) ( ) .

.
, .

,
.
, newValue.
.
,
:
subscript(_) > _ {
//
}

,

, .
,
. .

18 225

,
( 18.1).
: . ,
, .
Chess
man, ,
.
, .
:
, , , ,
.
oordinates,
.
18.1
1 class gameDesk {
2
var desk: [Int:[String:Chessman]] = [:]
3
init(){
4
for i in 1...8 {
5
desk[i] = [:]
6
}
7
}
8
func setChessman(chess: Chessman, coordinates: (String, Int)){
9
if let oldCoordinates = chess.coordinates {
10
desk[oldCoordinates.1]![oldCoordinates.0] = nil
11
}
12
self.desk[coordinates.1]![coordinates.0] = chess
13
chess.setCoordinates(char: coordinates.0, num:

coordinates.1)
14
}
15 }
16 var game = gameDesk()
17 game.setChessman(QueenBlack, coordinates: ("B",2))
18 game.setChessman(QueenBlack, coordinates: ("A",3))

gameDesk . , ( Chessman).
desk
.

226 IV. Swift

,
. ,
.

( ),
.
setChessman desk, . ,
coordinates Chessman.

.
(18.2). .
, ,
nil.
18.2
1 class gameDesk {
2
var desk: [Int:[String:Chessman]] = [:]
3
init(){
4
for i in 1...8 {
5
desk[i] = [:]
6
}
7
}
8
subscript(alpha: String, number: Int) -> Chessman? {
9
get{
10
if let chessman = self.desk[number]![alpha] {
11
return chessman
12
}
13
return nil
14
}
15
}
16
func setChessman(chess: Chessman, coordinates: (String, Int)){
17
if let oldCoordinates = chess.coordinates {
18
desk[oldCoordinates.1]![oldCoordinates.0] = nil
19
}
20
self.desk[coordinates.1]![coordinates.0] = chess
21
chess.setCoordinates(char: coordinates.0, num:

coordinates.1)
22
}
23 }
24 var game = gameDesk()
25 game.setChessman(QueenBlack, coordinates: ("A",3))
26 game["A",3]?.coordinates

18 227

,
(
get).
,
coordinates
.

setChessman() .
, ,
(
18.3).
18.3
1 class gameDesk {
2
var desk: [Int:[String:Chessman]] = [:]
3
init(){
4
for i in 1...8 {
5
desk[i] = [:]
6
}
7
}
8
subscript(alpha: String, number: Int) -> Chessman? {
9
get{
10
if let chessman = self.desk[number]![alpha] {
11
return chessman
12
}
13
return nil
14
}
15
set{
16
self.setChessman(newValue!, coordinates: (alpha,

number))
17
}
18
}
19
func setChessman(chess: Chessman, coordinates: (String, Int)){
20
if let oldCoordinates = chess.coordinates {
21
desk[oldCoordinates.1]![oldCoordinates.0] = nil
22
}
23
self.desk[coordinates.1]![coordinates.0] = chess
24
chess.setCoordinates(char: coordinates.0, num:

coordinates.1)
25
}
26 }
27 var game = gameDesk()
28 game.setChessman(QueenBlack, coordinates: ("A",3))
29 game["C",5] = QueenBlack
30 QueenBlack.coordinates

228 IV. Swift

newValue
. ,
.
, , .

Swift . ,
, .

, , ,
gameDesk ,
nil. desk, coordinates .
1. ,
. , Chessman kill().
2. printDesk() gameDesk,
:
1 _ _ _ _ _ _ _
2
3
4
5
6
7
8

_
_
_
_
_
_
_

_
_
_
_
_
_
_

_
_
_
_
_
_
_

_
_
_
_
_
_
_

_ _
_ _
_ _
_ _
_ _
_ _
_

_
_
_
_
_
_
_

_
_
_
_
_
_
_

A B C D E F G H

( symbol
Chessman), .

19

- . . ,
, ,
, -.
.
(
), ( ,
).

19.1.
.

class SomeSubClass: SomeSuperClass {


//
}
SomeSubClass,
SomeSuperClass,
.

, SomeSu
perClass, SomeSubClass .

.

230 IV. Swift

, Quadruped
(19.1). .
Dog, .
Quadruped Dog, .
19.1
1 //
2 class Quadruped {
3
var type = ""
4
var name = ""
5
func walk(){
6
print("walk")
7
}
8 }
9 //
10 class Dog: Quadruped {
11
func bark(){
12
print("woof")
13
}
14 }
15 var dog = Dog()
16 dog.type = "dog"
17 dog.walk() // walk
18 dog.bark() // woof

myDog
Quadruped . , Dog
,
bark().

.



,
, self.
Dog ,
. name,
Quadruped ( 19.2).

19 231
19.2
1 //
2 class Dog: Quadruped {
3
func bark(){
4
print("woof")
5
}
6
func printName(){
7
print(self.name)
8
}
9 }
10 var dog = Dog()
11 dog.name = "Dragon Wan Helsing"
12 dog.printName() // Dragon Wan Helsing

, , . , .

19.2.
,
, . . Swift override
.


,
, .
,
. NoisyDog,
. Dog NoisyDog.
bark() ,
Dog,
(19.3).
19.3
1 class NoisyDog: Dog{
2
override func bark(){
3
print ("woof")

232 IV. Swift


4
print ("woof")
5
print ("woof")
6
}
7 }
8
9 var badDog = NoisyDog()
10 badDog.bark() // woof woof woof

override Swift,
bark() NoisyDog .
, .

.
.


,
, Swift
.
self
super.
bark() NoisyDog
.
"woof", . bark()
, ( 19.4).
19.4
1
2
3
4
5
6
7
8
9

class NoisyDog: Dog{


override func bark(){
for _ in 1...3 {
super.bark()
}
}
}
var badDog = NoisyDog()
badDog.bark() // woof woof woof

19 233

:
someMethod()
, super.
someMethod() (
).
someProperty
,
super.someProperty .
someIndex ,
super[someIndex] .


,
. ,
, ,
.

. ,
, , .
,
.

super.init().


Quadruped . Dog type "dog".
,
( 19.5).
19.5
1 class Dog: Quadruped {
2
override init(){
3
super.init()
4
self.type = "dog"

234 IV. Swift


5
6
7
8
9
10
11
12 }

}
func bark(){
print("woof")
}
func printName(){
print(self.name)
}

, . .
, ,
.


,
. .

.
,
. :
,
.
,
, .

, . .

19.3. final
Swift .

19 235

final,
:
final class ;
final var ;
final func ;
final subscript .

.
, .

19.4.
, ,

.
19.6.
Quadruped .
19.6
1
2
3
4
5
6
7

var animalsArray: [Quadruped] = []


var someAnimal = Quadruped()
var myDog = Dog()
var dabDog = NoisyDog()
animalsArray.append(someAnimal)
animalsArray.append(myDog)
animalsArray.append(badDog)

animalsArray Dog
NoisyDog. , Quadruped.

19.5.
: Quadruped, Dog NoisyDog, animalsArray,
.
, ( ).
, .

236 IV. Swift

:
;

.


is . true ,

.
animalsArray ( 19.7).
19.7
1 for item in animalsArray {
2
if item is Dog {
3
print("Yap")
4
}
5 }
6 // Yap 2

animalsArray Dog. ,
: Dog
NoisyDog.


,
animalsArray
. , , ( Quadruped).
Dog,
bark(), Swift ,
Quadruped.
Swift,
,
as, , : as? as!.

19 237

, ,
.
:
as? ? (
), nil .
as!

.
.

animalsArray.
bark(), Quadruped, Dog NoiseDog (
19.8).
19.8
1 for item in animalsArray {
2
if var animal = item as? NoisyDog {
3
animal.bark()
4
}else if var animal = item as? Dog {
5
animal.bark()
6
}else{
7
item.walk()
8
}
9 }

animalArray item.
as?
. item NoisyDog Dog,
bark().

20

Any
AnyObject

Swift ,
:
AnyObject ;
Any .
,
.

20.1. Any
Any . ,
( 20.1).
20.1
1
2
3
4
5
6
7

var things = [Any]()


things.append(0)
things.append(0.0)
things.append(42)
things.append("hello")
things.append((3.0, 5.0))
things.append({ (name: String) -> String in "Hello, \(name)" })

things : Int, Double, String, (Double,


Double) (String)->String. .

,
, Any.

20 Any AnyObject 239


Any Hashable, Any , , . , , .

Any
. , .
, (
20.2).
20.2
1 for
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 }

thing in things {
switch thing {
case let someInt as Int:
print("an integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
print("a positive double value of \(someDouble)")
case let someString as String:
print("a string value of \"\(someString)\"")
case let (x, y) as (Double, Double):
print("an (x, y) point at \(x), \(y)")
case let stringConverter as String -> String:
print(stringConverter("Troll"))
default:
print("something else")
}

:
an integer value of 0
something else
an integer value of 42
a string value of "hello"
an (x, y) point at 3.0, 5.0
Hello, Troll


as. switch-case
- ( ).

240 IV. Swift

20.2. AnyObject
AnyObject ,
.

Cocoa Foundation.
Objective-C,
.
AnyObject (
20.3).
20.3
1 let someObjects: [AnyObject] = [Dog(),NoisyDog(),Dog()]

AnyObject .
, , AnyObject,
.

AnyObject
, AnyObject
.
AnyObject
( 20.4).
20.4
1 for object in someObjects {
2
let animal = object as! Dog
3
print("This is bad Dog")
4 }


( 20.5).
20.5
1 for object in someObjects as! [Dog]{
2
print("This is bad Dog")
3 }

21

, .
,
.

21.1.

,
.



,
:
init(){};
, .
,
.
,
nil.

, , (designated).

242 IV. Swift


. , (
),
. ,
self.init() .
.

,
, ,
. ,
.
.


,
( nil).


Swift (conveni
ence) . .

.
. ,

.
.

convenience init() {
//
}
conve
nience, init.
.

21 243
.

Quadruped , Dog
NoisyDog. Dog ,

. , type (
21.1).
21.1
1 class Dog: Quadruped {
2
override init(){
3
super.init()
4
self.type = "dog"
5
}
6
convenience init(text: String){
7
self.init()
8
print(text)
9
}
10
func bark(){
11
print("woof")
12
}
13
func printName(){
14
print(self.name)
15
}
16 }
17 var myDog = Dog(text: " Dog ")

Dog
.
.

.



. , :
,
.

244 IV. Swift


, .


Swift
:
.

.

.
.21.1.

. 21.1.

. ,
. ,
.

21 245


(
).



, , ,
- .
(failable) . nil .
.

init?() {
//
}
init?
( ), ,
.
return nil.

.
, .

( ),
.
.
(21.2).
21.2
1 class Rectangle{
2
var height: Int
3
var weight: Int
4
init?(height h: Int, weight w: Int){
5
self.height = h
6
self.weight = w
7
if !(h > 0 && w > 0) {
8
return nil
9
}

246 IV. Swift


10
}
11 }
12 var rectangle = Rectangle(height: 56, weight: -32) // nil

.
, nil. , nil, .
nil .
.


,

.
, .
,
.
,
. 21.3.
TemperatureUnit ,
. ,
,
, nil, .
21.3
1 enum TemperatureUnit {
2
case Kelvin, Celsius, Fahrenheit
3
init?(symbol: Character) {
4
switch symbol {
5
case "K":
6
self = .Kelvin
7
case "C":
8
self = .Celsius
9
case "F":
10
self = .Fahrenheit
11
default:
12
return nil
13
}

21 247
14
}
15 }
16 let fahrenheitUnit = TemperatureUnit(symbol: "F")

symbol .
.
, ,
init?(rawValue:). ( 21.4).
21.4
1
2
3
4
5

enum TemperatureUnit: Character {


case Kelvin = "K", Celsius = "C", Fahrenheit = "F"
}
let fahrenheitUnit = TemperatureUnit(rawValue: "F")
fahrenheitUnit!.hasValue

TemperatureUnit Character.
, ,
.
init? init!. ,
,
.
nil.


(required) ,
.

required init() {
//
}
init required.
, required ,
.

248 IV. Swift

override
.

21.2.
.

. . .
, , ,
.

deinit {
//
}
deinit, .


. , . , ,
,
.
( 21.5).
21.5
1 class SuperClass {
2
init?(isNil: Bool){
3
if isNil == true {
4
return nil
5
}else{
6
print(" ")
7
}
8
}
9
deinit {
10
print(" ")
11
}
12 }
13 class SubClass:SuperClass{

21 249
14
15
16
17 }
18
19 var
20 obj

deinit {
print(" ")
}
obj = SubClass(isNil: false)
= nil

SubClass , .
,
nil. , , .

22

ARC

,
, .
, .
, .


Swift ,
Swift .

22.1.
, ,
, .
:
;
Swift.


SubClass?, nil.
Swift.
myClass, description. -

22 ARC 251

,
.
,
(22.1).
22.1
1 class myClass{
2
var description: String
3
init(description: String){
4
print(" \(description) ")
5
self.description = description
6
}
7
deinit{
8
print(" \(self.description) ")
9
}
10 }
11 var myVar1 = myClass(description: "")
12 if true {
13
var myVar2 = myClass(description: "")
14 }

myVar2 , if. , ,
.

.
if , , .
.
,
.


, ( 22.2).

252 IV. Swift


22.2
1 class myClass{
2
var description: String
3
init(description: String){
4
print(" \(description) ")
5
self.description = description
6
}
7
deinit{
8
print(" \(self.description) ")
9
}
10 }
11 var myVar1 = myClass(description: "")
12 var myVar2 = myVar1
13 myVar1 = myClass(description: "")
14 myVar2 = myVar1

myVar1
myClass. myVar2
.
,
.
, Swift , .
,
.

22.2.
, .


, .
, .
(22.3).

22 ARC 253
22.3
1 class Human {
2
let name: String
3
var child = [Human?]()
4
var father: Human?
5
var mother: Human?
6
init(name: String){
7
self.name = name
8
}
9
deinit {
10
print(self.name+" - ")
11
}
12 }
13 if 1==1 {
14
var Kirill = Human(name: "")
15
var Olga = Human(name: "")
16
var Aleks = Human(name: "")
17
Kirill.father = Aleks
18
Kirill.mother = Olga
19
Aleks.child.append(Kirill)
20
Olga.child.append(Kirill)
21 }

,
, . ,
, .
, ,
, , Swift , ,
.
.


Swift , . , , ,
, ,
.
. .
, Swift , , , ,

254 IV. Swift

.
. , Swift
, .
.
weak
onowned. weak ,
nil . weak .
,
( ).

unowned.
,
father mother ( 22.4).
22.4
1 class Human {
2
let name: String
3
var child = [Human?]()
4
weak var father: Human?
5
weak var mother: Human?
6
init(name: String){
7
self.name = name
8
}
9
deinit {
10
print(self.name+" - ")
11
}
12 }
13 if 1==1 {
14
var Kirill = Human(name: "")
15
var Olga = Human(name: "")
16
var Aleks = Human(name: "")
17
Kirill.father = Aleks
18
Kirill.mother = Olga
19
Aleks.child.append(Kirill)
20
Olga.child.append(Kirill)
21 }

:
-
-
-

22 ARC 255

,
.
. ,
,
.

22.3.
ARC
(Automatic Reference Counting ),
.

.

ARC
ARC Swift ,
.
, ,
.
, ,
,
, .
, ARC
, ,
.
, ARC
.
, ARC Swift .


, . ,
.

256 IV. Swift

.
, .
. 22.5 ,
( ).
22.5
1 class Human{
2
var name = ""
3
deinit{
4
print(" ")
5
}
6 }
7 var closure : (() -> ())?
8 if true{
9
var human = Human()
10
closure = {
11
print(human.name)
12
}
13
closure!()
14 }
15 print(" ")

human, Human, , ,
.
, ,
.

.
,
, Swift
.

, ,
( 22.6).

22 ARC 257
22.6
1 class Human{
2
var name = ""
3
deinit{
4
print(" ")
5
}
6 }
7 var closure : (() -> ())?
8 if true{
9
var human = Human()
10
//
11
closure = {
12
[unowned human] in
13
print(human.name)
14
}
15
closure!()
16 }

human
, Swift .
unowned ,
.

23

, ,
. ,
,
.

23.1.

, ,
?
,
( 23.1).
23.1
1
2
3
4
5
6

class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}

Person Residence,
.
Person,
residence nil, .
numberOfRooms, , , -

23 259

.
, residence .

(23.2).
23.2
1
2
3
4
5
6
7

var man = Person()


if let manResidence = man.residence {
print(" \(manResidence.numberOfRooms) ")
}else{
print(" ")
}
//

, ,
.
, ,
Residence ( 23.3).
23.3
1 class Person {
2
var residence: Residence?
3 }
4 class Residence {
5
var numberOfRooms = 1
6
var room: Room?
7 }
8 class Room {
9
var square: Int = 10
10 }

, square .
.
, .
( 23.4).
,
room. ( residence, room)
.

260 IV. Swift


23.4
1 var man = Person()
2 var residence = Residence()
3 var room = Room()
4 man.residence = residence
5 residence.room = room
6 if let square = man.residence?.room?.square {
7
print(" \(square) ..")
8 }else{
9
print(" ")
10 }
11 //

- man.
residence?.room?.square ( nil),
.
,
, nil.
nil.

. .

,

.
, .

23.2.


. .
( 23.5).
square.

23 261
23.5
1 man.residence?.room?.square = 36
2 man.residence?.room?.square // 36

man.residence?.room?.square, .
- ,
, .

23.3.

, , .
Residence , ( 23.6).
23.6
1 class Residence {
2
var numberOfRooms = 1
3
var room: Room?
4
func returnNumberOfRooms() {
5
return numberOfRooms
6
}
7 }


( 23.7).
23.7
1 man.residence?.printNumberOfRooms()
2 //

, .

24

(, ),
. , ,
(, , , Swift
).

.

.

(static).
.
,
.
.
,
. , .

extension {
// SomeType
}
extension, . .

24 263

, ,
, .

24.1.

. Double,
(24.1) Double
.
24.1
1 extension Double {
2
var km: Double { return self * 1000.0 }
3
var m: Double { return self }
4
var cm: Double { return self / 100.0 }
5
var mm: Double { return self / 1000.0 }
6
var ft: Double { return self / 3.28084 }
7 }
8 let oneInch = 25.4.mm
9 print(" - \(oneInch) ")
10 // " - 0.0254 "
11 let threeFeet = 3.ft
12 print(" - \(threeFeet) ")
13 // " - 0.914399970739201 "


.
Double.
, 1.0 Double . m
self.
. , 1000 ,
km
self * 1000.

, , .

264 IV. Swift


. .

24.2.

. , , .
.
.

Double (
24.2). ,
. ,

, .
24.2
1 import UIKit
2 // ""
3 struct Line{
4
var pointOne: (Double, Double)
5
var pointTwo: (Double, Double)
6 }
7 // Double
8 extension Double {
9
init(line: Line){
10
self = sqrt(pow((line.pointTwo.0 - line.pointOne.0),2) +

pow((line.pointTwo.1 - line.pointOne.1),2))
11
}
12 }
13 var myLine = Line(pointOne: (10,10), pointTwo: (14,10))
14 var lineLength = Double(line: myLine) // 4

UIKit sqrt() pow() (


),
.

24 265

Line ,
. Line
.

,
.

24.3.

.
( 24.3). Int
repetitions,
() -> (). ,
,
.
24.3
1 extension Int {
2
func repetitions(task: () -> ()) {
3
for _ in 0..<self {
4
task()
5
}
6
}
7 }
8 3.repetitions({
9
print("Swift")
10 })
11 /*
12
Swift
13
Swift
14
Swift */

mutating. square(),
.
Int , mutating
( 24.4).

266 IV. Swift


24.4
1
2
3
4
5
6
7

extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()

24.4.
, ,
.
24.5 Int
, . , .
24.5
1 extension Int {
2
subscript(var digitIndex: Int) -> Int {
3
var decimalBase = 1
4
while digitIndex > 0 {
5
decimalBase *= 10
6
--digitIndex
7
}
8
return (self / decimalBase) % 10
9
}
10 }
11 746381295[0]
12 // 5
13 746381295[1]
14 // 9

, 0, .

25

Swift , ,
.
, , . - ,
.
.

.
- , .

protocol {
//
}
protocol,
.
- , :
struct : {
//
}
. .
, ,
,
:

268 IV. Swift


class : , 1,
2{
//
}

25.1.
(static), .
( ).
.
,
.
{get},
{get set}.
,
(25.1).
25.1
1 protocol SomeProtocol {
2
var mustBeSettable: Int { get set }
3
var doesNotNeedToBeSettable: Int { get }
4 }

SomeProtocol , (var) Int.


mustBeSettable ,
doesNotNeedToBeSettable .
,
, , . ,
doesNotNeedToBeSettable , .

static var.
, ( 25.2).

25 269
25.2
1 protocol AnotherProtocol {
2
static var someTypeProperty: Int { get set }
3 }

someTypeProperty .

( 25.3).
25.3
1
2
3
4
5
6
7

protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
var fullName: String
}
let john = Person(fullName: "John Wick")

FullyNamed, Person fullName String.

25.2.
.
.

static.
. mutating.
mutating , .
.

, ,
, ,
( 25.4).

270 IV. Swift


25.4
1 protocol RandomNumberGenerator {
2
func random() -> Double
3
static func getRandomString()
4
mutating func changeValue(newValue: Double)
5 }

RandomNumberGenerator, . random() Double.


getRandomString ,
. changeValue()
Double.

, ,
.

25.3.
.
, ,
.
. ,
required. , .

required , final.

, , , ( 25.5).
25.5
1 protocol Named{
2
init(name: String)
3 }
4 class Person : Named {

25 271
5
6
7
8
9 }

var name: String


required init(name: String){
self.name = name
}

25.4.
- ,
.
.
, ,

, .
,
is,
.
true,
, false .

25.5.
, .



.

(25.6).
25.6
1
2
3
4
5
6
7
8
9

protocol TextRepresentable {
func asText() -> String
}
extension Int: TextRepresentable {
func asText() -> String {
return String(self)
}
}
5.asText()

272 IV. Swift

TextRepresentable , asText(). Int


, , -
,
.


, , .
Swift2.0.
, .

, .
TextRepre
sen
table ( 25.7).
25.7
1 extension TextRepresentable {
2
func description() -> String {
3
return " TextRepresentable"
4
}
5 }
6 5.description()

TextRepresentable.
, Int .
Int.

25.6.
.
, , , -

25 273

.
,
.
25.8.
25.8
1 protocol SuperProtocol {
2
var someValue: Int { get }
3 }
4 protocol SubProtocol: SuperProtocol {
5
func someMethod()
6 }
7 struct SomeStruct: SubProtocol{
8
let someValue: Int = 10
9
func someMethod() {
10
//
11
}
12 }

SuperProtocol ,
SubProtocol ,
. SubProtocol, ,
, .

25.7.
,
(
). class.
.
25.9. SubProtocol ,
.
25.9
1 protocol SubProtocol: class, SuperProtocol {
2
func someMethod()
3 }

274 IV. Swift

25.8.
, ,
. , ,
, .
, .

protocol<1, 2 ...>
protocol, .

25.10 , .
25.10
1 protocol Named {
2
var name: String { get }
3 }
4 protocol Aged {
5
var age: Int { get }
6 }
7 struct Person: Named, Aged {
8
var name: String
9
var age: Int
10 }
11 func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
12
print(" , \(celebrator.name)! \

(celebrator.age)!")
13 }
14 let birthdayPerson = Person(name: " ", age: 46)
15 wishHappyBirthday(birthdayPerson)
16 // " , ! 46!"

: Named Aged.
.
wishHappyBirthday()
, .
Person, .
Any. . Any
protocol<>, .

26

, , Swift
, .
, ,

.
: Swift
, .
, , ?,
.
, Swift , : , , ,
.
Swift . ?
, , .
, . , Hashable
, .
- ,

276 IV. Swift

,
.
Swift CollectionType . ,
,
.
, Array, Set Dictionary.
Xcode. 26.1.
26.1
1 var str: String

, Option,
String.
, .
String.
Option, str .

(.26.1).

26.1.

Declaration String, Xcode


String (.26.2).
.
, Xcode
.

26 277

. 26.2.

Apple,
, Swift Xcode.
Conforms To ,
String,
Hashable. , .
, (26.2). keys values ,
,
.
26.2
1 var countryDict = ["RUS":"
", "BEL":"", "UKR":""]


2 // countryDict
3 var keysOfDict = countryDict.keys

["BEL": "",
"UKR": "",
"RUS": "
"]
LazyMapCollection
<Dictionary<String,
String>, String>

278 IV. Swift


4 // countryDict
5 var valuesOfDict = countryDict.values

LazyMapCollection
<Dictionary<String,
String>, String>

keys values Swift ,


, , :
LazyMapCollection<Dictionary<String, String>, String>

Option
keysOfDict,
,
LazyMapCollection (.26.3).

. 26.3. LazyMapCollection

, . Collection
, .
:
struct LazyMapCollection<Base : CollectionType, Element>

, , ,
, ,

26 279

, Base .

Element.
Element. ,
Element ,
.
Conforms To.
LazyCollectionType. , (.26.4).

. 26.4. LazyCollectionType

Inherits From.
CollectionType, LazyCollectionType.
CollectionType , , ,
, . ,
CollectionType (.26.5).
Adopted By ,
. Array ,
Dictionary, Set.

280 IV. Swift

. 26.5. CollectionType

, .26.6.
protocol
CollectionType

protocol
LazyCollectionType

structs
Array,
Dictionary,
Set

struct
LazyMapCollection

. 26.6.

, Array , Dictionary Set , LazyMapCollection ,

26 281
CollectionType , , , ,

, .
LazyMapCollection
Element . ,
. ,
, 26.2
countryDict. Xcode keysofDict.
:
var keys: LazyMapCollection<Dictionary<String, String>, String>

, :
LazyMapCollection<Dictionary<String, String>, String>

(Dictionary<String, String>)
, , (String)
.
Element.
, keys arrays , String.
, ,
, ? , .
,
(26.3).
26.3
1 var countryDict = ["RUS":"
", "BEL":"",
"UKR":""]

2 var keys = Set(countryDict.keys)
3 var values = Array(countryDict.values)


["BEL": "",
"UKR": "",
"RUS": "
"]
{"BEL", "UKR", "RUS"}
["",
"",
"
"]


reverse(), .
26.4, ,
ReverseRandomAccessCollection
<Array<Int>>. , ,

282 IV. Swift

,
, ,
Array<Int> ( <[Int]>). ,
.
26.4
1 var someArray = [1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]
2 var reverseSomeArray = someArray.reverse()
ReverseRandomAccessCollection<Array<Int>>

, reverse() Array(),
keys values ,
Array<Int> ( 26.5).
26.5
1 var someArray = [1, 3, 5, 7, 9]
2 let resArray: Array<Int> = someArray.reverse()

[1, 3, 5, 7, 9]
[9, 7, 5, 3, 1]

, ,
,
Apple , , . .

27

(generic)
Swift. .

,
.

(, ) .
,
Swift ,
.
Array (). ,
: Array<Int>, Array<String> ..
, .
, , Dictonary ,
Hashable (
).

27.1.
,
( 27.1).
27.1
1 func swapTwoInts(inout a: Int, inout b: Int) {
2
let temporaryA = a
3
a = b
4
b = temporaryA

284 IV. Swift


5
6
7
8

}
var firstInt = 4010
var secondInt = 13
swapTwoInts(&firstInt, &secondInt)

swapTwoInts() , , , . firstInt secondInt .


, .
, :
swapTwoStrings(), swapTwoDoubles() ..
, ,
- ,
.
,
:
.
, , :
, ,
.
swapTwoInts() (
27.2).
27.2
1
2
3
4
5
6
7
8

func swapTwoValues<T>(inout a: T, inout b: T) {


let temporaryA = a
a = b
b = temporaryA
}
var firstString = "one"
var secondString = "two"
swapTwoValues(&firstString, b: &secondString)

T,

(Int, String ..). ,
a b .

27 285

swapTwoValues() , swapTwoInts().
.
,
, .
,
.

27.2.

.
, , .
Stack ().
, ,
:
push() ;
pop()
.

.
(
27.3).
27.3
1 struct IntStack {
2
var items = [Int]()
3
mutating func push(item: Int) {
4
items.append(item)
5
}
6
mutating func pop() -> Int {
7
return items.removeLast()
8
}
9 }


Int. [Int].

.

286 IV. Swift

.
,
( 27.4).
27.4
1 struct Stack<T> {
2
var items = [T]()
3
mutating func push(item: T) {
4
items.append(item)
5
}
6
mutating func pop() -> T {
7
return items.removeLast()
8
}
9 }

,

.
Stack,
, ( 27.5).
27.5
1
2
3
4

var stackOfStrings = Stack<String>()


stackOfStrings.push("uno")
stackOfStrings.push("dos")
let fromTheTop = stackOfStrings.pop()

Stack<String> .
,
( 27.6). , .
27.6
1 struct Stack<T> {
2
var items = [T]()
3
init(){}
4
init(_ elements: T...){
5
self.items = elements
6
}

27 287
7
8
9
10
11
12
13 }
14 var
15 var

mutating func push(item: T) {


items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
stackOfInt = Stack(1, 2, 4, 5)
stackOfStrings = Stack<String>()

,
,
.
,
.

27.3.
, .
Dictionary, :
Hashable.
.
, .
(
),
; , ,
, .

.
, ( 27.7).
Swift
Equatable.
(==) (!=). , , .

288 IV. Swift


27.7
1 func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
2
for (index, value) in array.enumerate() {
3
if value == valueToFind {
4
return index
5
}
6
}
7
return nil
8 }
9 var myArray = [3.14159, 0.1, 0.25]
10 let firstIndex = findIndex(myArray, valueToFind: 0.1) // 1
11 let secondIndex = findIndex(myArray, valueToFind: 31) // nil

<T: Equatable>. , Equatable.


,
Int Equatable, ,
.

27.4.
Swift .
, , .
Stack,
,
( 27.8).
27.8
1 extension Stack {
2
var topItem: T? {
3
return items.isEmpty ? nil : items[items.count - 1]
4
}
5 }

topItem T
. , . nil.

27.5.

, , .

27 289

,
.
,
- .
Container, Item
Type ( 27.9).
27.9
1 protocol Container {
2
typealias ItemType
3
mutating func append(item: ItemType)
4
var count: Int { get }
5
subscript(i: Int) -> ItemType { get }
6 }

Container () , Stack.
, , .
ItemType, .
Stack 27.10.
27.10
1 struct Stack<T>: Container {
2
typealias ItemType = T
3
var items = [T]()
4
var count: Int {
5
return items.count
6
}
7
init(){}
8
init(_ elements: T...){
9
self.items = elements
10
}
11
subscript(i: Int) -> T {
12
return items[i]
13
}
14
mutating func push(item: T) {
15
items.append(item)
16
}
17
mutating func pop() -> T {
18
return items.removeLast()
19
}

290 IV. Swift


20
21
22
23 }

mutating func append(item: T) {


items.append(item)
}

Stack Container, : , .
typealias , .

item append , Swift , T
ItemType, Container.
typealias ,
, .

28


.
.
,
.
.

.
.

28.1.
Swift , .
Error
Type, , , ,
.
. .
,
( 28.1).
28.1
1 enum VendingMachineError: ErrorType {
2
case InvalidSelection
3
case InsufficientFunds(coinsNeeded: Int)
4
case OutOfStock
5 }

292 IV. Swift

:
;
;
.
, -
.
.
, throw. ,
( 28.2).
28.2
1 throw VendingMachineError.InsufficientFunds(coinsNeeded: 5)

28.2.
- . .
Swift :
.
do-catch.
.
.
- ,
,
try.
.


(, ),
, ,
, .
, ,
throws.
28.3 ,
.

28 293
28.3
1 func anotherFunc() throws {
2
//
3
var value = try someFunc()
4
// ...
5 }
6 func someFunc() throws -> String{
7
//
8
try anotherFunc()
9
// ...
10 }
11 try someFunc()

someFunc() String, throws .


anotherFunc()
, , anotherFunc(). ,
, try. anotherFunc()
, .
throws, .
throw, .
28.4.
28.4
1 struct Item {
2
var price: Int
3
var count: Int
4 }
5 class VendingMachine {
6
var inventory = [
7
"Candy Bar": Item(price: 12, count: 7),
8
"Chips": Item(price: 10, count: 4),
9
"Pretzels": Item(price: 7, count: 11)
10
]
11
var coinsDeposited = 0
12
func dispenseSnack(snack: String) {
13
print("Dispensing \(snack)")
14
}
15
func vend(itemNamed name: String) throws {
16
guard var item = inventory[name] else {
17
throw VendingMachineError.InvalidSelection

294 IV. Swift


18
19
20
21
22
23

24
25
26
27
28
29
30 }

}
guard item.count > 0 else {
throw VendingMachineError.OutOfStock
}
guard item.price <= coinsDeposited else {
throw VendingMachineError.InsufficientFunds(coinsNeeded:
item.price - coinsDeposited)
}
coinsDeposited -= item.price
--item.count
inventory[name] = item
dispenseSnack(name)

Item
. VendingMachine . inventory , .
coinsDeposited .
dispenseSnack() ,
. vend()
.
( ,
) vend() , VendingMachineError.
guard
throw. throw ,
, .
vend() ,
try do-catch.
, - ( 28.5).
favoriteSnacks
.
28.5
1 let favoriteSnacks = [
2
"Alice": "Chips",
3
"Bob": "Licorice",
4
"Eve": "Pretzels",

28 295
5
6

7
8
9

]
func buyFavoriteSnack(person: String, vendingMachine:
VendingMachine) throws {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
try vendingMachine.vend(itemNamed: snackName)
}

buyFavoriteSnack() ,
vend(), throw try.

do-catch

,
.
do-catch.

do {

try
} catch 1 {
// ...
} catch 2 {
// ...
}
do catch. do
, .
try.
,
catch. , .
where .
catch- .
,
error.

do-catch, ( 28.6).
28.6
1 var vendingMachine = VendingMachine()
2 vendingMachine.coinsDeposited = 8
3 do {

296 IV. Swift


4
try buyFavoriteSnack("Alice", vendingMachine: vendingMachine)
5 } catch VendingMachineError.InvalidSelection {
6
print("Invalid Selection.")
7 } catch VendingMachineError.OutOfStock {
8
print("Out of Stock.")
9 } catch VendingMachineError.InsufficientFunds(let coinsNeeded) {
10
print(" . , \

(coinsNeeded) ().")
11 }
12 // " . ,
2 ()."

buyFavoriteSnack()
do.
Alice, .



try , , try? .
,
nil.
28.7.
28.7
1 func someThrowingFunction() throws -> Int {
2
// ...
3 }
4 let x = try? someThrowingFunction()

someThrowingFunction() , x nil.


,
.
try! , ,
,
.
28.8.

28 297
28.8
1 let photo = try! loadImage("./Resources/John Appleseed.jpg")

loadImage() ,
.
,
try! .
:
, .

28.3.
Swift ,
.
defer, .
, .
,
defer, ..

( 28.9).
28.9
1 func processFile(filename: String) throws {
2
if exists(filename) {
3
let file = open(filename)
4
defer {
5
close(file)
6
}
7
while let line = try file.readline() {
8
// .
9
}
10
}
11 }

defer .

29

,
Swift. ,
.

.

29.1.

Swift.
, ,
( 29.1).
29.1
1 struct Vector2D {
2
var x = 0.0, y = 0.0
3 }

x y .
(0,0),
.
,

(+), 29.2.

29 299
29.2
1
2
3
4
5
6

func + (left: Vector2D, right: Vector2D) -> Vector2D {


return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector

,
. ,

.
, , Swift
.
.


, .
Swift ( ) ( ) .


prefix postfix .

Vector2D ( 29.3).
29.3
1
2
3
4
5
6

prefix func - (vector: Vector2D) -> Vector2D {


return Vector2D(x: -vector.x, y: -vector.y)
}
let positive = Vector2D(x: 3.0, y: 4.0)
let negative = -positive
// negative - Vector2D (-3.0, -4.0)


, .

300 IV. Swift


(+)
.

(inout),
.
29.4
- Vector2D.
29.4
1
2
3
4
5
6
7

func += (inout left: Vector2D, right: Vector2D) {


left = left + right
}
var original = Vector2D(x: 1.0, y: 2.0)
let vectorToAdd = Vector2D(x: 3.0, y: 4.0)
original += vectorToAdd
// original (4.0, 6.0)

, .
Vector2D.
,
.


, ,
.
( 29.5).
29.5
1
2
3
4
5
6
7

func == (left: Vector2D, right: Vector2D) -> Bool {


return (left.x == right.x) && (left.y == right.y)
}
func != (left: Vector2D, right: Vector2D) -> Bool {
return !(left == right)
}
let twoThree = Vector2D(x: 2.0, y: 3.0)

29 301
8 let anotherTwoThree = Vector2D(x: 2.0, y: 3.0)
9 if twoThree == anotherTwoThree {
10
print(" .")
11 }
12 // " ."

==
Vector2D. false
,
.

29.2.
Swift .
operator prefix, infix postfix,
,
.
+++, Vector2D ( 29.6).
29.6
1 prefix operator +++ {}
2 prefix func +++ (inout vector: Vector2D) -> Vector2D
3 {
4
vector += vector
5
return vector
6 }
7 var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
8 let afterDoubling = +++toBeDoubled
9 // toBeDoubled (2.0, 8.0)
10 // afterDoubling (2.0, 8.0)

.
Swift. iOS

.
.
.
.
. , .
.

, 192102, -, . (. ), 3, , . 7.
034-2014, 58.11.12
, .
24.12.15. 6090/16. . . . . 19,000. 700. 0000.
.
.
142300, , . , . , 1.

Вам также может понравиться