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()
```

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2015/05/09 13:51:49
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:yayayai

質問1

上記の最後から4行目でplayerに代入していますが、

 代入時は、?は不要でよいでしょうか。?はnilになりうる。ということで

 代入では不要の理解でよいでしょうか。

質問2

 上記の最後の3行で、playerで?がついているところがありますが

 これは、なぜ?が必要でしょうか。

 また、?をつけずにいると、エラーの警告が!をつけますか?となります。

 そこで!にすると、構文エラーではなくなりますが、!でもよいのでしょうか。

 ?と!でいる場合どのように違いますでしょうか。

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

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

質問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言語を学ぶ

id:yayayai

ありがとうございます。
解決しましたm(_ _)m

2015/05/09 13:51:42

その他の回答0件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

質問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言語を学ぶ

id:yayayai

ありがとうございます。
解決しましたm(_ _)m

2015/05/09 13:51:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません