以下のようなソースがあり
```
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
上記の最後から4行目でplayerに代入していますが、
代入時は、?は不要でよいでしょうか。?はnilになりうる。ということで
代入では不要の理解でよいでしょうか。
質問2
上記の最後の3行で、playerで?がついているところがありますが
これは、なぜ?が必要でしょうか。
また、?をつけずにいると、エラーの警告が!をつけますか?となります。
そこで!にすると、構文エラーではなくなりますが、!でもよいのでしょうか。
?と!でいる場合どのように違いますでしょうか。
以上、お手数ですがどうぞよろしくお願い致します。
質問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言語を学ぶ
質問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言語を学ぶ
ありがとうございます。
解決しましたm(_ _)m
ありがとうございます。
2015/05/09 13:51:42解決しましたm(_ _)m