人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

swiftのオプショナルについて質問です。
以下のようなソースがあり
```
var player:AVAudioPlayer?
// String型の引数からサウンドファイルを読み込む
let soundPath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent(soundName)
// 読み込んだファイルにパスをつける
let url:NSURL? = NSURL.fileURLWithPath(soundPath)
// playerに読み込んだmp3ファイルのパスを設定
player = AVAudioPlayer(contentsOfURL: url, error: nil)
player?.numberOfLoops = -1
player?.prepareToPlay()
player?.play()
```


●質問者: FujiiRock
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

質問1
上記の最後から4行目でplayerに代入していますが、
代入時は、?は不要でよいでしょうか。?はnilになりうる。ということで
代入では不要の理解でよいでしょうか。

質問2
上記の最後の3行で、playerで?がついているところがありますが
これは、なぜ?が必要でしょうか。
また、?をつけずにいると、エラーの警告が!をつけますか?となります。
そこで!にすると、構文エラーではなくなりますが、!でもよいのでしょうか。
?と!でいる場合どのように違いますでしょうか。

以上、お手数ですがどうぞよろしくお願い致します。


1 ● a-kuma3
●100ポイント ベストアンサー

質問1
上記の最後から4行目でplayerに代入していますが、
代入時は、?は不要でよいでしょうか。?はnilになりうる。ということで
代入では不要の理解でよいでしょうか。

? をつけた方が良いと思います。

// playerに読み込んだmp3ファイルのパスを設定
player = AVAudioPlayer(contentsOfURL: url, error: nil)

player のインスタンスを獲得するときに、エラーの場合には nil を返します。
つまり、player には nil が代入される可能性があります。

質問2
上記の最後の3行で、playerで?がついているところがありますが
これは、なぜ?が必要でしょうか。
また、?をつけずにいると、エラーの警告が!をつけますか?となります。
そこで!にすると、構文エラーではなくなりますが、!でもよいのでしょうか。
?と!でいる場合どのように違いますでしょうか。

質問1の回答と同様、player は nil になる可能性があります。
プロパティやメソッドにアクセスする際、変数の末尾に ? をつけると、nil の場合にはアクセスが行われません。
以下のコードと同等になります。

player = AVAudioPlayer(contentsOfURL: url, error: nil)
if player != nil {
 player.numberOfLoops = -1
 player.prepareToPlay()
 player.play()
}

! の場合には、nil が代入されないことを明示的に表す書き方です。
このソースの場合、AVAudioPlayer() が nil を返すケースがあるので不適切です。
player に nil が代入されないことが保障されている場合に ! を使います。

var defaultPlayer: AVAudioPlayer
defaultPlayer = ... // デフォルトのオブジェクト

player = AVAudioPlayer(contentsOfURL: url, error: defaultPlayer) // エラーのときはデフォルトを使う
player!.numberOfLoops = -1
player!.prepareToPlay()
player!.play()

? との対比でこういった書き方をしましたが、nil が入らないことが保障されている場合には、暗黙的なオプショナル型を使う方が適切です。

var player: AVAudioPlayer! // 暗黙的なオプショナル型で宣言
var defaultPlayer: AVAudioPlayer
defaultPlayer = ... // デフォルトのオブジェクト

player = AVAudioPlayer(contentsOfURL: url, error: defaultPlayer) // エラーのときはデフォルトを使う
player.numberOfLoops = -1 // ! は必要ない
player.prepareToPlay()
player.play()


オプショナル型については、ここが分かりやすいかな、と思います。
オプショナル型 | Swift言語を学ぶ


FujiiRockさんのコメント
ありがとうございます。 解決しましたm(_ _)m
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ