詳解Swift改訂版読書勉強会 #4 活動記録
本日も2/28、渋谷のコワーキングスペース、beezで
詳解Swift改訂版読書勉強会 #4というイベントをやりました。
イベントURL:http://connpass.com/event/27434/
このイベントは、毎週日曜日の午前中に詳解 Swift 改訂版を一章ずつ読み合わせていくイベントです。
今からSwiftを覚えたい!って言う人にはぴったりのイベントです。
今週の発表は@ToraDadyさん。
私は、運営スタッフとして参加しました!
今日の内容
今日は詳解Swift改訂版の第四章、オプショナルを解説しました。
項目だけ抜粋します。
- オプショナル型とnil
- オプショナル型の存在意義
- オプショナル型の値を開示する
- 条件判定とオプショナル型
- if-let文
- オプショナル束縛と条件式
- gurd文
- nil合体演算子
- オプショナル型と関数
- 失敗のあるイニシャライザ
今日のハイライト
私が以前作った資料も共有しました。
また、質問があって、議論になったのは以下の2つでした
- if let 文の有効性
- 宣言時の!(implicitly unwrapped optional)の使い方
- オプショナルを使うとき
if let 文の有効性
オプショナル型に値があるかどうかは!=
でnilかをチェックする方法がある。
var nagano: Int? = nil
if nagano != nil {
print("nagano: \(nagano!)")
}
でもこれだと、if文のスコープで、nagano
変数にnilを入れたりできる。
潜在的なバグがif文通っても入る可能性があるのは危ない。
//if文通ってもnilを代入できる
var nagano: Int? = nil
if nagano != nil {
nagano = nil // ->nilをいれちゃう??
print("nagano: \(nagano!)")
}
if let文だとアンラップした変数は変更ができないので、if文通過したものは安心して使える
let year: Int? = Int("2020")
if let y = year {
//y は書き換えができない!
print("あと\(y - 2016)年")
} else {
print("エラー")
}
宣言時の!(implicitly unwrapped optional)の使い方
IBOutletのときはXcodeが挿入するコードにはUIButton!
とimplicitly unwrapped optional型で宣言される
@IBOutlet weak var myButton: UIButton!
これはViewControllerがinit()で初期化された瞬間はmyButton
インスタンスはnilだけど、ViewがloadされてmyButton
に値が挿入されたら、基本的にmyButton
にnilが入ることはないと考えらるから。
参加者の質問で自分でimplicitly unwrapped optional型で定義する場合はどこかというものがありました。
考えられるのは
「nilになる可能性があるけれど、一度値が入ったら、絶対nilがならない変数」を作るときにimplicitly unwrapped optional型が有効になると思います。
オプショナル型にするかどうかはどうやって決めるのか?
変数をオプショナル型にするかどうかは、そのプロジェクトの仕様に決まります。
nilになる状態になるかどうかは開発者が決める必要があります。
例えば、住所を表すRoom
クラスと人を表すPerson
クラスを作ります。
class Room {
var adress : String = "渋谷区"
}
class Person {
var room : Room?
}
Person
クラスでプロパティとしてroom
プロパティを持つことにします。
どこの部屋にいるかを表していますね。
ここで、var room : Room?
で?
ありのオプショナル型で宣言したということは、
「room
プロパティにnilを許容します、つまりこのプロジェクトでは部屋を持っていない人も許容します(=ホームレス)」という意味になります。
ここは、言語仕様よりは、プロジェクトの仕様の問題なので、nilが入る可能性がある場合はオプショナル型をつけましょう!
次回開催
次回は3/6
内容は基本的なデータ型!
私が発表します!
お楽しみに!
http://connpass.com/event/27871/
Facebookページ
Swift読書勉強会
https://www.facebook.com/groups/1543718659272111/