型推論
l
e
t s
t
r
: S
t
r
i
n
g = "
h
i
r
o
s
h
i
だお"
l
e
t s
t
r = "
h
i
r
o
s
h
i
だお"
Slide 12
Slide 12 text
クロー
ジャ
JS
やってる人ならお馴染み
l
e
t d
o
u
b
l
e = { (
x
: I
n
t
) -
> I
n
t i
n
x * 2
}
d
o
u
b
l
e
(
2
)
/
/
即時関数でU
I
の定義したり、
コー
ルバック書いたり
l
e
t l
a
b
e
l
: U
I
L
a
b
e
l = {
l
e
t l
b = U
I
L
a
b
e
l
(
f
r
a
m
e
: C
G
R
e
c
t
(
x
: 0
, y
: 0
, w
i
d
t
h
: 2
0
0
, h
e
i
g
l
b
.
b
a
c
k
g
r
o
u
n
d
C
o
l
o
r = U
I
C
o
l
o
r
.
r
e
d
l
b
.
t
e
x
t = "
h
o
g
e
"
r
e
t
u
r
n l
b
}
(
)
Slide 13
Slide 13 text
高階関数
filter, map, flatMap, reduce..
l
e
t a
r
r = [
0
, 1
, 3
, 5
, 7
, 1
1
]
l
e
t d
o
u
b
l
e
d
A
r
r = a
r
r
.
m
a
p { (
n
u
m
: I
n
t
) i
n
n
u
m * 2
}
Slide 14
Slide 14 text
パター
ンマッチング
l
e
t a
n
y
: A
n
y = 1
s
w
i
t
c
h a
n
y {
c
a
s
e l
e
t s
t
r a
s S
t
r
i
n
g
:
p
r
i
n
t
(
"
m
a
t
c
h
: \
(
s
t
r
)
"
)
c
a
s
e l
e
t i
n
t a
s I
n
t
:
p
r
i
n
t
(
i
n
t
)
d
e
f
a
u
l
t
:
p
r
i
n
t
(
"
d
e
f
a
u
l
t
"
)
}
他にも色々
ある
詳しくはSwift 2
のパター
ンマッチ構文集(
ほぼ翻訳)
参照
Slide 15
Slide 15 text
3. null
安全な言語
Slide 16
Slide 16 text
null
安全とは
ヌルポを実行時ではなく実行前にコンパイラがエラー
として警告してく
れる仕組み
Slide 17
Slide 17 text
Optional
型
nil
かもしれないですよ型。
l
e
t a
: I
n
t
? = n
i
l /
/ ?
はo
p
t
i
o
n
a
l
型のシンタックスシュガー
Optional
型だけnil
を受け取れる
l
e
t u
r
l
: U
R
L
? = U
R
L
(
s
t
r
i
n
g
: "
h
t
t
p
s
:
/
/
h
i
r
o
s
h
i
.
c
o
m
"
) /
/
①
l
e
t s
a
f
a
f
i
V
C = S
F
S
a
f
a
r
i
V
i
e
w
C
o
n
t
r
o
l
l
e
r
(
u
r
l
: u
r
l
) /
/
②
➀:url
が空文字などで開けないかもしれない。
から標準ライブラリの
URL
はoptional
型で初期化される
➁:
アプリ内でsafari
を開けるViewController
にURL
を渡そうとするが、
Optional
型のままだとエラー
がでてビルドできない
Slide 18
Slide 18 text
アンラップ
Optional
型から安全にnil
を除去して値を取り出すこと
/
/ g
u
a
r
d
文。n
i
l
だったら早期退出させる
g
u
a
r
d l
e
t u
r
l
: U
R
L
? = U
R
L
(
s
t
r
i
n
g
: "
h
t
t
p
s
:
/
/
h
i
r
o
s
h
i
.
c
o
m
"
) e
l
s
e
r
e
t
u
r
n
}
l
e
t s
a
f
a
f
i
V
C = S
F
S
a
f
a
r
i
V
i
e
w
C
o
n
t
r
o
l
l
e
r
(
u
r
l
: u
r
l
)
/
/ S
u
c
c
e
s
s
!
/
/
他にもこんな書き方とかある(
?
?
演算子)
l
e
t n
a
m
e
: S
t
r
i
n
g
? = n
i
l
/
/ n
a
m
e
がn
i
l
だったらh
i
r
o
s
h
i
は"
s
a
d
a
o
!
"
l
e
t h
i
r
o
s
h
i = n
a
m
e ?
? "
s
a
d
a
o
!
"
参照型の問題
コー
ドを見ないとどこで参照されて、
どこまでインスタンスが共有され
るのか不明
ひろしがさだおになって大事故な例
c
l
a
s
s U
s
e
r {
l
e
t i
d
: I
n
t
v
a
r n
a
m
e
: S
t
r
i
n
g
i
n
i
t (
i
d
: I
n
t
, n
a
m
e
: S
t
r
i
n
g
) {
s
e
l
f
.
i
d = i
d
s
e
l
f
.
n
a
m
e = n
a
m
e
}
}
l
e
t h
i
r
o
s
h
i = U
s
e
r
(
i
d
: 1
0
0
1
, n
a
m
e
: "
h
i
r
o
s
h
i
"
)
l
e
t s
a
d
a
o = h
i
r
o
s
h
i
s
a
d
a
o
.
n
a
m
e = "
s
a
d
a
o
!"
d
u
m
p
(
h
i
r
o
s
h
i
) /
/ i
d
: 1
0
0
0
, n
a
m
e
: s
a
d
a
o
!
Slide 22
Slide 22 text
値型
代入時、
値はコピー
されるため、
インスタンスは共有されない。
Swift
のStruct(
構造体)
は値型
ひろしはひろしでさだおはさだおな例
s
t
r
u
c
t U
s
e
r {
l
e
t i
d
: I
n
t
v
a
r n
a
m
e
: S
t
r
i
n
g
}
l
e
t a = U
s
e
r
(
i
d
: 1
0
0
1
, n
a
m
e
: "
h
i
r
o
s
h
i
"
)
l
e
t b = a
b
.
n
a
m
e = "
s
a
d
a
o
"
d
u
m
p
(
a
) /
/ i
d
: 1
0
0
0
, n
a
m
e
: h
i
r
o
s
h
i
Slide 23
Slide 23 text
値型中心の言語
Slide 24
Slide 24 text
値型中心の言語
Swift
では値型の構造体を積極的に利用した設計が推奨されている (Swift
実践入門 p.248)
Swift
の標準ライブラリはほとんどがStruct
String
Array
Dictionary
Bool
Int
Double
Float
Swift
実践入門を買いなさい
Slide 25
Slide 25 text
コピー
ごとにコストがかかるのでは?
Slide 26
Slide 26 text
Copy on Write
代入時点ではコピー
が発生しない。
代入した値を変更時、
初めてコピー
が発生する仕組み
l
e
t a = [
2
, 3
, 5
, 7
]
v
a
r b = a /
/
ここでコピー
は発生しない
p
r
i
n
t
(
b
)
b
[
2
] = 4 /
/
ここでコピー
が発生する
参考:Swift
のArray
が実はすばらしかった
参考:
純粋値型Swift
コー
ドが肥大化,
複雑化する例
1.
各画面共通の見た目だから、BaseViewController
クラスを作成
2. showAlert
メソッドを基底クラスに実装
3. 『
この画面だけアラー
トの出し方を変えたい』 by:
デザイナー
4. Base
クラスの変更に迫られる。
変更時の影響が大
Base
クラスに条件分岐を書く
Override
したサブクラスを作成し、
継承させる
Base
クラスからshowAlert
を剥がす
Slide 30
Slide 30 text
Protocol
で解決
Slide 31
Slide 31 text
Protocol
とは
型のインター
フェー
スを定義するもの
複数のprotocol
に準拠させることができる
継承が利用できない構造体でも使用できる
機能単位でprotocol
を作るので、
何のprotocol
に準拠しているのか
明確
p
r
o
t
o
c
o
l s
h
o
w
A
l
e
r
t
T
y
p
e {
v
a
r m
e
s
s
a
g
e
: S
t
r
i
n
g { g
e
t }
f
u
n
c s
h
o
w
A
l
e
r
t
(
m
e
s
s
a
g
e
: S
t
r
i
n
g
)
}
/
/
複数のp
r
o
t
o
c
o
l
を組み合わせて機能を実現する
c
l
a
s
s h
o
g
e
V
i
e
w
C
o
n
t
r
o
l
l
e
r
: U
I
V
i
e
w
C
o
n
t
r
o
l
l
e
r
, s
h
o
w
A
l
e
r
t
T
y
p
e
,
v
a
r m
e
s
s
a
g
e
: S
t
r
i
n
g = "
" /
/
実装しないとエラー
になる
f
u
n
c s
h
o
w
A
l
e
r
t
(
m
e
s
s
a
g
e
: S
t
r
i
n
g
) {
.
.
.
} /
/
実装しないとエラー
にな
Slide 32
Slide 32 text
Protocol Extension
Slide 33
Slide 33 text
Protocol Extension
とは
デフォルト実装を定義できる
where Self
で型の指定が可能
p
r
o
t
o
c
o
l s
h
o
w
A
l
e
r
t
T
y
p
e {
f
u
n
c s
h
o
w
A
l
e
r
t
(
m
e
s
s
a
g
e
: S
t
r
i
n
g
)
}
/
/ U
I
V
i
e
w
C
o
n
t
r
o
l
l
e
r o
r
サブクラスで使用可能
e
x
t
e
n
s
i
o
n s
h
o
w
A
l
e
r
t
T
y
p
e w
h
e
r
e S
e
l
f
: U
I
V
i
e
w
C
o
n
t
r
o
l
l
e
r {
f
u
n
c s
h
o
w
A
l
e
r
t
(
m
e
s
s
a
g
e
: S
t
r
i
n
g
) {
l
e
t a
l
e
r
t = U
I
A
l
e
r
t
C
o
n
t
r
o
l
l
e
r
(
t
i
t
l
e
: n
i
l
, m
e
s
s
a
g
e
: m
e
s
s
l
e
t d
e
f
A
c
t
i
o
n = U
I
A
l
e
r
t
A
c
t
i
o
n
(
t
i
t
l
e
: "
O
K
"
, s
t
y
l
e
: .
a
l
e
r
t
.
a
d
d
A
c
t
i
o
n
(
d
e
f
A
c
t
i
o
n
)
s
e
l
f
.
p
r
e
s
e
n
t
(
a
l
e
r
t
, a
n
i
m
a
t
e
d
: t
r
u
e
, c
o
m
p
l
e
t
i
o
n
: n
i
l
}
}
Slide 34
Slide 34 text
使い方
Protocol
に準拠したクラスでメソッドを呼び出すだけ
c
l
a
s
s h
o
g
e
V
i
e
w
C
o
n
t
r
o
l
l
e
r
: s
h
o
w
A
l
e
r
t
T
y
p
e
, B
a
n
n
e
r
V
i
e
w
T
y
p
e {
s
h
o
w
A
l
e
r
t
(
m
e
s
s
a
g
e
: "
エラー
です"
)
}
Slide 35
Slide 35 text
6. Generics
Slide 36
Slide 36 text
Generics
は強力
Generics
を使うと型の恩恵を失わず、
汎用的な実装ができる
ジェネリック関数
f
u
n
c
関数名<
型引数>
(
引数) -
>
戻り値の型 { }
他にもジェネリック型とかあるよ!
詳しくは神本買ってね!(
雑)
/
/ Q
i
i
t
a
R
e
q
u
e
s
t
型に準拠するクラス・
構造体なら何でも渡せるA
P
I
呼び出し関数
f
u
n
c c
a
l
l
<
R
e
q
u
e
s
t
: Q
i
i
t
a
R
e
q
u
e
s
t
>
(
r
e
q
u
e
s
t
: R
e
q
u
e
s
t
) -
> O
b
s
e
r
v
a
b
l
Codable
Swift
標準で、JSON
のシリアライズ・
デシリアライズができるようにな
った(
今までは代々、
ライブラリ頼みだった)
参考:https://github.com/apple/swift‑
evolution/blob/master/proposals/0166‑swift‑archival‑
serialization.md
p
u
b
l
i
c s
t
r
u
c
t F
a
r
m : C
o
d
a
b
l
e {
p
u
b
l
i
c l
e
t n
a
m
e
: S
t
r
i
n
g
p
u
b
l
i
c l
e
t l
o
c
a
t
i
o
n
: L
o
c
a
t
i
o
n
p
u
b
l
i
c l
e
t a
n
i
m
a
l
s
: [
A
n
i
m
a
l
]
}
d
o {
l
e
t f
a
r
m = t
r
y J
S
O
N
D
e
c
o
d
e
r
(
)
.
d
e
c
o
d
e
(
F
a
r
m
.
s
e
l
f
, f
r
o
m
: p
a
y
l
o
a
/
/ E
x
t
r
a
c
t
e
d a
s u
s
e
r t
y
p
e
s
:
l
e
t c
o
o
r
d
i
n
a
t
e
s = "
\
(
f
a
r
m
.
l
o
c
a
t
i
o
n
.
l
a
t
i
t
u
d
e
, f
a
r
m
.
l
o
c
a
t
i
o
n
.
} c
a
t
c
h {
/
/ E
n
c
o
u
n
t
e
r
e
d e
r
r
o
r d
u
r
i
n
g d
e
s
e
r
i
a
l
i
z
a
t
i
o
n
}
Slide 41
Slide 41 text
文字列周りAPI
の強化
複数行に渡る文字列
p
r
i
n
t
(
"
"
"
あいうえお かきくけこ
さしすせそ たちつてと
なにぬねの はひふへほ
まみむめも や ゆ よ
らりるれろ わ を ん
"
"
"
)
Slide 42
Slide 42 text
文字列周りAPI
の強化
characters
型を介さなくても文字列が扱いやすくなった。
(String
がCollectionType
になったため)
> S
w
i
f
t
3
l
e
t s
t
r
i
n
g = "
w
e c
a
n
'
t
"
l
e
t p
r
e
f
i
x
e
d = S
t
r
i
n
g
(
s
t
r
i
n
g
.
c
h
a
r
a
c
t
e
r
s
.
p
r
e
f
i
x
(
6
)
)
> S
w
i
f
t
4
l
e
t s
t
r
i
n
g = "
w
e c
a
n
`
t
"
l
e
t p
r
e
f
i
x
e
d = s
t
r
i
n
g
.
p
r
e
f
i
x
(
6
)
l
e
t s
u
b
s
t
r
i
n
g = s
t
r
i
n
g
[
i
n
d
e
x
.
.
.
]
参考:
他にもDictionaly
が使いやすくなったり色々
ある
https://www.raywenderlich.com/163857/whats‑new‑swift‑4
Slide 43
Slide 43 text
Migrating to Swift 4
手順
1. Xcode9
をインストー
ルする
2. Swift 3.2
でアプリが正常にビルドできるようにする
3. Swift4
対応のバー
ジョンにライブラリをアップデー
トする
4. Edit ‑> Convert ‑> To Current Swift Syntax…
https://swift.org/migration‑guide‑swift4/