詳解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/