質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Swift

    7032questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

[swift]Optionalの考えについて

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 865
退会済みユーザー

退会済みユーザー

nilは何もないというのは例えば玉入れで玉が入ってない。その状態がnilでいいのでしょうか?
そしてOptionalは玉入れをスタートする前の状態つまり始まると玉が入る可能性もあるが入らない可能性もある。でいいのですか?
Optionalはどういう時にどのように使うのですか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんにちは。

Optional型は、つぎのふたつの状態をとり得る型で、もしかしたら値がないかもしれない、というときに使用します。

1)整数値や文字列などの値をもつ状態
2)値をもたない状態

たとえば

var title: String?

のように、String?型として宣言された変数は文字列のほかに nilを値とすることができます。
この場合、titleプロパティは String?型であり、String?型は Optional<String>型のシンタックスシュガー(糖衣構文:プログラミング言語の読み書きのしやすさのために、既に存在する構文に別の記法を与えたもの)でもあります。

ここで重要なことは、String?は Optional<String>と等価であることを理解することです。
よくあるのは、String型の変数には nilを代入できないが、String?にすれば nilを代入できるという理解のしかたです。これは、まちがってはいませんが正確とはいえません。
ここでは話が複雑になる可能性があるのでくわしく書きませんが、Swiftの Optionalは、ひとつの(特別な)型であると理解することが Optionalを使ううえで将来的に意味をもってきます。

通常、String型として宣言された変数は文字列のほかに値を保持できませんが、String?型として宣言された変数は文字列のほかに nilを値とすることができます。つまり、nilを値とすることで、値をもたない状態を表すことができるのです。

var name: String = “Rola”
var title: = “Hello Maggy”
name = nil // エラーになる
title = nil //代入できる

上記のように型名に接尾辞 ?をつけて、nilを代入することができるようにすることを、Optiolan型でラップするといいます。
例では、String型で説明しましたが、ほかの型でも Optional型でラップすることによって nilが代入可能となります。たとえば、Int型もInt?として数値のほかに nilを代入することができます。

じっさいに Optionalを使う場面として、検索関数を例にとってみてみましょう。
配列からあたえられた文字列を検索し、存在すればそのインデックスを、存在しなければ nilを返す関数です。

func indexOf(array:String[], value: String) -> Int? {
  for (index, str) in enumerate(array) {
    if str == value {
      return index
    }
  }
  return nil
}

let model = [“Rola”, “Maggy”, “Loveli”]

if let index = indexOf(model, "Reina") {
  println("Reina は\(index)番目に存在します")
} else {
  println("存在しません")
}

Objective-Cなどでも、関数やメソッドが処理を失敗したときに niを返すといったことはよくありました。しかし、Swiftが nilを返された場合、それと決定的に異なっているのは、Optionalは値を使う前に nilかどうかをチェックしなければならない点です。
Objective-Cでは、nilを返すメソッドについて、失敗した際の処理を無視したとしても問題なくコンパイルできてしまうことがよくあります。そのため、意図しないエラーの処理をし忘れたことによるバグを生みだしてきました。
Swiftでは、Optionalを導入することで、コードを書くものにエラー処理を強制し、そうしたバグを未然に防ぐことができるようになっているのです。

以上、ご参考いただければ幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/27 16:00

    一番わかりやすかったです。講師ですか?本当にありがとうございます!

    キャンセル

  • 2015/04/27 16:02

    motryさん、コメント(返信)をいただきありがとうございます。
    僕の回答がすこしでもお役に立てたとしたら、とてもうれしいです。

    ※講師ではありません。

    キャンセル

0

初めまして。
私の認識ではnilは玉入れでいえばカゴもありません。
何もない状態です。
玉入れで例えるならカゴオブジェクトの中に
var ball: Ball?
と定義できます。
Ballが入ってくるとは限りませんからね。
カゴは必ずありますが、ボールは必ずあるとは限りません。

お店でいえば商品が入ってくるか入ってこないか分からない時などに使います。
商品オブジェクトをこのように定義します。
var product: Product?
これにより商品オブジェクトが入る時もあれば商品そのものが入らない時もある。
その商品が入ってこない可能性もあると変数を見るだけでわかりますね。
Androidでいえば@Nullableみたいなものでしょうか。。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

参考情報:
- Swift言語の入門 (6) オプション型編 http://8kpixel.blogspot.jp/2014/06/swift-6.html
...
オプション型とは、名前の通り、必ずしも存在する訳ではない、と言った意味合いがあり、その型そのものの値を含むか、もしくはその値が存在しないことを意味する型です。
...

上のページとは別に、私なりの swift のオプション型の利用例を2つ紹介します。

1 値が未設定という状態を扱う例。
2 値が未設定か否かでの記述例。

1 値が未設定という状態を扱う例
ーーーーーーーーーーーーーーーー
Int 配列中 の最小値を求めるとします。
擬似コードで書くと、こんな風にすることがあります。
funciton min(array)
  int min = Int.MAXVALUE
  for ( i in array) {
    if i < min {
      min = i
    }
  return min
}

array = [] だったときと、arrary = [Int.MAXVALUE] だったとき
のどちらも min(array) の返り値は Int.MAXVALUE で区別がつきません。

swift の オプションをつかうなら
func min(array: Array[Int]) -> Int? {
   ...
}
と書けば、
min([]) の場合は nil が返り、
min([Int.MAXVALUE]) の場合は Int.MAXVALUE が返るので区別がつきます。

2 値が未設定か否かでの記述例。
ーーーーーーーーーーーーーーーー
変数 v の属性にアクセスしたり、メソッドを呼ぶ必要があるが、
変数が nil の場合があるか そうでないかが不明な場合には
if v != nil {
  // v.foo(), v.attr  を呼べる
}
のように記載する必要があります。

swift では
v が T? だった場合( nil であることもあるという場合)
if let v0 = v {
   // この ブロック中では v0 は nil でないことが保証される
   // v0.foo(), v0.attr を呼べる
 }
 のような記述が可能になっています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7032questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています