Xcode 6-SWIFT-Cast CMTime как Float

var songs = MPMediaQuery()
var localSongs = songs.items
songList = NSMutableArray(array: localSongs)

tableView.reloadData()

var song = MPMediaItem(coder: songList[0] as NSCoder)

var currentItem = AVPlayerItem(URL: song.valueForProperty(MPMediaItemPropertyAssetURL) as NSURL)

player.replaceCurrentItemWithPlayerItem(currentItem)

player.play()

var songTitle: AnyObject! = song.valueForProperty(MPMediaItemPropertyTitle)

songName.text = songTitle as? String

sliderOutlet.value = Float(player.currentTime()) // <<-Error here

Я создаю музыкальный проигрыватель и хочу, чтобы ползунок показывал продолжительность песни, но получаю эту ошибку

Не удалось найти перегрузку для «init», которая принимает предоставленные аргументы.

Я думаю, что проблема заключается в преобразовании CMTime в Float.


person Abdou23    schedule 17.09.2014    source источник


Ответы (2)


CMTime — это структура, содержащая value, timescale и другие поля, поэтому вы не можете просто "привести" ее к значению с плавающей запятой.

К счастью, есть функция преобразования CMTimeGetSeconds():

let cmTime = player.currentTime()
let floatTime = Float(CMTimeGetSeconds(player.currentTime()))

Обновление: начиная с Swift 3 player.currentTime возвращает TimeInterval, который является псевдонимом типа для Double. Поэтому преобразование в Float упрощается до

let floatTime = Float(player.currentTime)
person Martin R    schedule 17.09.2014
comment
Да, это работает. Спасибо, @Martin. PS: Есть ли совет, как самостоятельно придумывать такие вещи в будущем? (кроме того, чтобы спросить здесь, конечно :)) я попытался прочитать ссылку CMTime, но не смог понять. - person Abdou23; 17.09.2014
comment
@Abdou023: Что ж, CMTimeGetSeconds() задокументировано в developer.apple.com/library/prerelease/ios/documentation/. Вы также можете щелкнуть cmd по типу или методу в исходном файле Swift (например, в CMTime), что приведет вас к определению Swift, где вы затем найдете связанные методы. - person Martin R; 17.09.2014

CMTime — это структура, содержащая значение, шкалу времени, флаги и эпоху. Таким образом, вы не можете просто «привести» его к значению с плавающей запятой.

Вы можете использовать значение, написав напрямую

sliderOutlet.value = Float(player.currentTime().value)

Но это даст только значение игрока в миллисекундах. Чтобы получить значение в секундах, вы используете это:

sliderOutlet.value = Float(CMTimeGetSeconds(player.currentTime()))

Имейте в виду, что это также может быть неправильным способом, которым вы должны иметь значение вашего ползунка.

person Mr. JD Agrawal    schedule 06.12.2017