Swiftで音楽プレイヤー作ってみた
みんなSwiftでなにか作ってるので作りたくなって。。(´・ω・`)
Objective-C分からなさすぎてiOSアプリ自体ほとんど作ったことないですが、
Swiftはすんなりできました。(だいぶはまったけど><)
ファイル構成
- AppDelegate.swift・・・そのまま
- ViewController.swift・・・Viewの処理
- SongQuery.swift・・・iPhoneに入っている曲の情報を返す
- Main.storyboard・・・NavigationControllerとTableViewおいただけ
コードの概要
曲リストの取得
func get() -> AlbumInfo[] { var albums: AlbumInfo[] = [] // アルバム情報から曲を取り出す var albumsQuery: MPMediaQuery = MPMediaQuery.albumsQuery() var albumItems: MPMediaItemCollection[] = albumsQuery.collections as MPMediaItemCollection[] var album: MPMediaItemCollection for album in albumItems { var albumItems: MPMediaItem[] = album.items as MPMediaItem[] var song: MPMediaItem var songs: SongInfo[] = [] var albumTitle: String = "" // album情報から曲リストを取得する for song in albumItems { albumTitle = song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String var songInfo: SongInfo = SongInfo( albumTitle: song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String, artistName: song.valueForProperty( MPMediaItemPropertyArtist ) as String, songTitle: song.valueForProperty( MPMediaItemPropertyTitle ) as String, // NSNumberじゃないとうまくいかない songId: song.valueForProperty( MPMediaItemPropertyPersistentID ) as NSNumber ) songs.append( songInfo ) } var albumInfo: AlbumInfo = AlbumInfo( albumTitle: albumTitle, songs: songs ) albums.append( albumInfo ) } return albums }
MPMediaQuery.albumsQuery()でアルバムのリストを取得できます。
アーティストを取得したい場合は、artistsQuery()で取得できます。
songIdは、UInt64で動くと思ったらなぜか動かず。。NSNumberなら動きました。
ナビゲーションにボタン追加
override func viewDidLoad() { super.viewDidLoad() let stopButton: UIBarButtonItem = UIBarButtonItem( title: "Stop", style: UIBarButtonItemStyle.Plain, target: self, action: "stop" ) self.navigationItem.rightBarButtonItem = stopButton } func stop() { // 処理 }
ドキュメントだとaction: Selectorってなっててなに入れるのかよく分からなかったですが
string型で指定すればいいみたいです。
http://stackoverflow.com/questions/24007650/selector-in-swift
ここ参考にしました。
選択した音楽を再生
func tableView( tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath! ) { // MPMediaItemPropertyPersistentID // 曲を識別するID let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId // IDからMPMediaItemオブジェクトを取得 let item: MPMediaItem = songQuery.getItem( songId ) let url: NSURL = item.valueForProperty( MPMediaItemPropertyAssetURL ) as NSURL //var error: NSError? = nil // 再生 audio = AVAudioPlayer( contentsOfURL: url, error: nil ) audio.play() self.title = albums[indexPath.section].songs[indexPath.row].songTitle }
MPMediaItemのvalueForPropertyメソッドはAnyObjectを返すので型変換してあげます。
AVAudioPlayerのerrorの部分にNSErrorを入れてもうまくいきませんでした。。
やり方が分かったら直します。
Swiftを使ってみて
Objective-CはとっつきにくくてiOSアプリの開発を半分諦めてましたが
Swiftはドキュメントを見ながらさくさく作ることが出来ました。
コードの補完がちゃんとされるようになればかなり楽に開発できると思います。
これまでAndroidアプリしか作ってこなかったですが、これでiOSアプリにも挑戦できそうです。