-
-
-
-
-
-
-
[
a
]
-
-
-
-
-
-
-
-
-
-
-
-
-
[
a
b
]
-
-
-
-
-
-
-
-
-
-
-
-
-
[
a
b
c
]
-
-
-
-
-
-
-
Slide 6
Slide 6 text
Observable
イベントストリー
ムを表す型
Slide 7
Slide 7 text
l
e
t t
e
x
t
F
i
e
l
d = U
I
T
e
x
t
F
i
e
l
d
(
)
l
e
t t
e
x
t = t
e
x
t
F
i
e
l
d
.
r
x
_
t
e
x
t /
/ O
b
s
e
r
v
a
b
l
e
<
S
t
r
i
n
g
>
Slide 8
Slide 8 text
subscribe(_:)
イベントごとにクロー
ジャを実行
Slide 9
Slide 9 text
l
e
t t
e
x
t
F
i
e
l
d = U
I
T
e
x
t
F
i
e
l
d
(
)
l
e
t t
e
x
t = t
e
x
t
F
i
e
l
d
.
r
x
_
t
e
x
t
t
e
x
t
.
s
u
b
s
c
r
i
b
e { p
r
i
n
t
(
$
0
) }
イベントごとに値を出力
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
bindTo(_:)
Observer(
概念)
に自動反映する
Slide 12
Slide 12 text
l
e
t t
e
x
t
F
i
e
l
d = U
I
T
e
x
t
F
i
e
l
d
(
)
l
e
t l
a
b
e
l = U
I
L
a
b
e
l
(
)
t
e
x
t
F
i
e
l
d
.
r
x
_
t
e
x
t
.
b
i
n
d
T
o
(
l
a
b
e
l
.
r
x
_
t
e
x
t
)
UITextField
からUILabel
に自動反映
t
e
x
t
F
i
e
l
d
.
r
x
_
t
e
x
t
.
m
a
p { "
\
(
$
0
.
c
h
a
r
a
c
t
e
r
s
.
c
o
u
n
t
)
" }
.
b
i
n
d
T
o
(
l
a
b
e
l
.
r
x
_
t
e
x
t
)
UITextField
の文字数をUILabel
にバインド
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
l
e
t b
u
t
t
o
n = U
I
B
u
t
t
o
n
(
)
l
e
t t
e
x
t
F
i
e
l
d
1 = U
I
T
e
x
t
F
i
e
l
d
(
)
l
e
t t
e
x
t
F
i
e
l
d
2 = U
I
T
e
x
t
F
i
e
l
d
(
)
l
e
t l
a
b
e
l = U
I
L
a
b
e
l
(
)
O
b
s
e
r
v
a
b
l
e
.
c
o
m
b
i
n
e
L
a
t
e
s
t
(
t
e
x
t
F
i
e
l
d
1
.
r
x
_
t
e
x
t
,
t
e
x
t
F
i
e
l
d
2
.
r
x
_
t
e
x
t
) { "
\
(
$
0
) \
(
$
1
)
" }
.
s
a
m
p
l
e
(
b
u
t
t
o
n
.
r
x
_
t
a
p
)
.
b
i
n
d
T
o
(
l
a
b
e
l
.
r
x
_
t
e
x
t
)
.
a
d
d
D
i
s
p
o
s
a
b
l
e
T
o
(
d
i
s
p
o
s
e
B
a
g
)
Slide 21
Slide 21 text
Rx vs
従来方式
イベントストリー
ムの扱いの違い
Slide 22
Slide 22 text
Rx
Slide 23
Slide 23 text
c
l
a
s
s 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 {
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
1
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
2
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r b
u
t
t
o
n
: U
I
B
u
t
t
o
n
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r l
a
b
e
l
: U
I
L
a
b
e
l
!
p
r
i
v
a
t
e l
e
t d
i
s
p
o
s
e
B
a
g = D
i
s
p
o
s
e
B
a
g
(
)
f
u
n
c v
i
e
w
D
i
d
L
o
a
d
(
) {
s
u
p
e
r
.
v
i
e
w
D
i
d
L
o
a
d
(
)
O
b
s
e
r
v
a
b
l
e
.
c
o
m
b
i
n
e
L
a
t
e
s
t
(
t
e
x
t
F
i
e
l
d
1
.
r
x
_
t
e
x
t
,
t
e
x
t
F
i
e
l
d
2
.
r
x
_
t
e
x
t
) { "
\
(
$
0
) \
(
$
1
)
" }
.
s
a
m
p
l
e
(
b
u
t
t
o
n
.
r
x
_
t
a
p
)
.
b
i
n
d
T
o
(
l
a
b
e
l
.
r
x
_
t
e
x
t
)
.
a
d
d
D
i
s
p
o
s
a
b
l
e
T
o
(
d
i
s
p
o
s
e
B
a
g
)
}
}
Slide 24
Slide 24 text
水道にホー
スをつなぐイメー
ジ
Slide 25
Slide 25 text
Observable × 2
Slide 26
Slide 26 text
combineLatest(_:_:)
Slide 27
Slide 27 text
sample(_:)
Slide 28
Slide 28 text
c
l
a
s
s 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 {
.
.
.
f
u
n
c v
i
e
w
D
i
d
L
o
a
d
(
) {
s
u
p
e
r
.
v
i
e
w
D
i
d
L
o
a
d
(
)
O
b
s
e
r
v
a
b
l
e
.
c
o
m
b
i
n
e
L
a
t
e
s
t
(
t
e
x
t
F
i
e
l
d
1
.
r
x
_
t
e
x
t
,
t
e
x
t
F
i
e
l
d
2
.
r
x
_
t
e
x
t
) { "
\
(
$
0
) \
(
$
1
)
" }
.
s
a
m
p
l
e
(
b
u
t
t
o
n
.
r
x
_
t
a
p
)
.
b
i
n
d
T
o
(
l
a
b
e
l
.
r
x
_
t
e
x
t
)
.
a
d
d
D
i
s
p
o
s
a
b
l
e
T
o
(
d
i
s
p
o
s
e
B
a
g
)
}
}
Slide 29
Slide 29 text
c
l
a
s
s 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 {
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
1
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
2
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r b
u
t
t
o
n
: U
I
B
u
t
t
o
n
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r l
a
b
e
l
: U
I
L
a
b
e
l
!
@
I
B
A
c
t
i
o
n f
u
n
c b
u
t
t
o
n
D
i
d
T
a
p
(
s
e
n
d
e
r
B
u
t
t
o
n
: U
I
B
u
t
t
o
n
)
l
a
b
e
l
.
t
e
x
t
= "
\
(
t
e
x
t
F
i
e
l
d
1
.
t
e
x
t
) \
(
t
e
x
t
F
i
e
l
d
2
.
t
e
x
t
)
"
}
}
Slide 30
Slide 30 text
バケツに水を入れるイメー
ジ
Slide 31
Slide 31 text
UITextField × 2
Slide 32
Slide 32 text
UILabel
Slide 33
Slide 33 text
c
l
a
s
s 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 {
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
1
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r t
e
x
t
F
i
e
l
d
2
: U
I
T
e
x
t
F
i
e
l
d
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r b
u
t
t
o
n
: U
I
B
u
t
t
o
n
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r l
a
b
e
l
: U
I
L
a
b
e
l
!
@
I
B
A
c
t
i
o
n f
u
n
c b
u
t
t
o
n
D
i
d
T
a
p
(
s
e
n
d
e
r
B
u
t
t
o
n
: U
I
B
u
t
t
o
n
)
l
a
b
e
l
.
t
e
x
t
= "
\
(
t
e
x
t
F
i
e
l
d
1
.
t
e
x
t
) \
(
t
e
x
t
F
i
e
l
d
2
.
t
e
x
t
)
"
}
}
e
n
u
m W
e
a
t
h
e
r {
c
a
s
e S
u
n
n
y
, C
l
o
u
d
y
, R
a
i
n
y
v
a
r d
e
s
c
r
i
p
t
i
o
n
: S
t
r
i
n
g {
s
w
i
t
c
h s
e
l
f {
c
a
s
e .
S
u
n
n
y
: r
e
t
u
r
n "
晴 "
c
a
s
e .
C
l
o
u
d
y
: r
e
t
u
r
n "
曇 "
c
a
s
e .
R
a
i
n
y
: r
e
t
u
r
n "
雨"
}
}
}
天気
Slide 39
Slide 39 text
f
i
n
a
l c
l
a
s
s W
e
a
t
h
e
r
A
P
I {
s
t
a
t
i
c f
u
n
c g
e
t
(
l
o
c
a
t
i
o
n l
o
c
a
t
i
o
n
: C
L
L
o
c
a
t
i
o
n
, h
a
n
d
l
e
r
:
l
e
t d
e
l
a
y = 1
.
0 * D
o
u
b
l
e
(
N
S
E
C
_
P
E
R
_
S
E
C
)
l
e
t t
i
m
e = d
i
s
p
a
t
c
h
_
t
i
m
e
(
D
I
S
P
A
T
C
H
_
T
I
M
E
_
N
O
W
, I
n
t
6
4
d
i
s
p
a
t
c
h
_
a
f
t
e
r
(
t
i
m
e
, d
i
s
p
a
t
c
h
_
g
e
t
_
m
a
i
n
_
q
u
e
u
e
(
)
) {
h
a
n
d
l
e
r
(
W
e
a
t
h
e
r
.
r
a
n
d
o
m
)
}
}
}
天気API
Slide 40
Slide 40 text
e
n
u
m L
o
c
a
t
i
o
n
S
t
a
t
u
s {
c
a
s
e A
u
t
h
o
r
i
z
e
d
(
C
L
L
o
c
a
t
i
o
n
)
c
a
s
e D
e
n
i
e
d
v
a
r d
e
s
c
r
i
p
t
i
o
n
: S
t
r
i
n
g {
s
w
i
t
c
h s
e
l
f {
c
a
s
e .
A
u
t
h
o
r
i
z
e
d
(
l
e
t l
o
c
a
t
i
o
n
)
:
l
e
t l
a
t
i
t
u
d
e = l
o
c
a
t
i
o
n
.
c
o
o
r
d
i
n
a
t
e
.
l
a
t
i
t
u
d
e
l
e
t l
o
n
g
i
t
u
d
e = l
o
c
a
t
i
o
n
.
c
o
o
r
d
i
n
a
t
e
.
l
o
n
g
i
t
u
d
e
r
e
t
u
r
n "
\
(
l
a
t
i
t
u
d
e
)
, \
(
l
o
n
g
i
t
u
d
e
)
"
c
a
s
e .
D
e
n
i
e
d
:
r
e
t
u
r
n "
位置情報 利用 許可 "
}
}
}
位置情報 +
認可情報
Slide 41
Slide 41 text
従来のUIViewController
Slide 42
Slide 42 text
c
l
a
s
s G
e
o
W
e
a
t
h
e
r
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
, C
L
L
o
c
a
t
i
o
n
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r l
o
c
a
t
i
o
n
L
a
b
e
l
: U
I
L
a
b
e
l
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r w
e
a
t
h
e
r
L
a
b
e
l
: U
I
L
a
b
e
l
!
@
I
B
O
u
t
l
e
t w
e
a
k v
a
r b
u
t
t
o
n
: U
I
B
u
t
t
o
n
!
v
a
r l
o
c
a
t
i
o
n
S
t
a
t
u
s
: L
o
c
a
t
i
o
n
S
t
a
t
u
s
? {
d
i
d
S
e
t {
l
o
c
a
t
i
o
n
L
a
b
e
l
.
t
e
x
t
= l
o
c
a
t
i
o
n
S
t
a
t
u
s
?
.
d
e
s
c
r
i
p
t
i
o
n ?
? "
-
"
}
}
v
a
r w
e
a
t
h
e
r
: W
e
a
t
h
e
r
? {
d
i
d
S
e
t {
w
e
a
t
h
e
r
L
a
b
e
l
.
t
e
x
t
= w
e
a
t
h
e
r
?
.
d
e
s
c
r
i
p
t
i
o
n ?
? "
-
"
}
}
}
Slide 43
Slide 43 text
@
I
B
A
c
t
i
o
n f
u
n
c b
u
t
t
o
n
D
i
d
T
a
p
(
s
e
n
d
e
r
B
u
t
t
o
n
: U
I
B
u
t
t
o
n
) {
s
t
a
r
t
U
p
d
a
t
i
n
g
L
o
c
a
t
i
o
n
(
)
}
f
u
n
c s
t
a
r
t
U
p
d
a
t
i
n
g
L
o
c
a
t
i
o
n
(
) {
l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
d
e
l
e
g
a
t
e = s
e
l
f
s
w
i
t
c
h C
L
L
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
a
u
t
h
o
r
i
z
a
t
i
o
n
S
t
a
t
u
s
(
) {
c
a
s
e .
N
o
t
D
e
t
e
r
m
i
n
e
d
:
l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
r
e
q
u
e
s
t
W
h
e
n
I
n
U
s
e
A
u
t
h
o
r
i
z
a
t
i
o
n
(
)
c
a
s
e .
A
u
t
h
o
r
i
z
e
d
A
l
w
a
y
s
, .
A
u
t
h
o
r
i
z
e
d
W
h
e
n
I
n
U
s
e
:
l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
s
t
a
r
t
U
p
d
a
t
i
n
g
L
o
c
a
t
i
o
n
(
)
c
a
s
e .
D
e
n
i
e
d
, .
R
e
s
t
r
i
c
t
e
d
:
l
o
c
a
t
i
o
n
S
t
a
t
u
s = .
D
e
n
i
e
d
w
e
a
t
h
e
r = n
i
l
}
}
Slide 44
Slide 44 text
/
/ M
A
R
K
: C
L
L
o
c
a
t
i
o
n
M
a
n
a
g
e
r
D
e
l
e
g
a
t
e
f
u
n
c l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
(
m
a
n
a
g
e
r
: C
L
L
o
c
a
t
i
o
n
M
a
n
a
g
e
r
, d
i
d
C
h
a
n
g
e
A
u
s
t
a
r
t
U
p
d
a
t
i
n
g
L
o
c
a
t
i
o
n
(
)
}
f
u
n
c l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
(
m
a
n
a
g
e
r
: C
L
L
o
c
a
t
i
o
n
M
a
n
a
g
e
r
, d
i
d
U
p
d
a
t
e
L
o
g
u
a
r
d l
e
t l
o
c
a
t
i
o
n = l
o
c
a
t
i
o
n
s
.
f
i
r
s
t e
l
s
e {
r
e
t
u
r
n
}
l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
s
t
o
p
U
p
d
a
t
i
n
g
L
o
c
a
t
i
o
n
(
)
l
o
c
a
t
i
o
n
M
a
n
a
g
e
r
.
d
e
l
e
g
a
t
e = n
i
l
W
e
a
t
h
e
r
A
P
I
.
g
e
t
(
l
o
c
a
t
i
o
n
: l
o
c
a
t
i
o
n
)
{ [
w
e
a
k s
e
l
f
] w
e
a
t
h
e
r i
n
s
e
l
f
?
.
l
o
c
a
t
i
o
n
S
t
a
t
u
s = .
A
u
t
h
o
r
i
z
e
d
(
l
o
c
a
t
i
o
n
)
s
e
l
f
?
.
w
e
a
t
h
e
r = w
e
a
t
h
e
r
}
}