Swiftで音楽プレイヤー作ってみた

みんなSwiftでなにか作ってるので作りたくなって。。(´・ω・`)
Objective-C分からなさすぎてiOSアプリ自体ほとんど作ったことないですが、
Swiftはすんなりできました。(だいぶはまったけど><)

つくったもの

だいぶシンプルな音楽プレイヤー。
https://raw.githubusercontent.com/sawapi/musicPlayer/master/screenshot.png
iPhoneに入ってる曲を取り出してタップすると再生します。

ファイル構成

  • 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アプリにも挑戦できそうです。