Xcode 6- SWIFT- 将CMTime转换为Float

15
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。

2个回答

34

CMTime是一个结构体,包含一个valuetimescale和其他字段,因此您不能将其直接“转换”为浮点值。

幸运的是,有一个转换函数CMTimeGetSeconds()

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

更新:Swift 3 开始,player.currentTime 返回一个类型别名为 DoubleTimeInterval。 因此转换为 Float 更加简化。

let floatTime = Float(player.currentTime)

1
没错,那个可行。谢谢@Martin。PS:除了在这里问之外,有没有什么技巧可以帮助我自己解决类似的问题?我尝试阅读CMTime参考文档,但是无法理解。 - Abdou23
@Abdou023:嗯,CMTimeGetSeconds()确实在https://developer.apple.com/library/prerelease/ios/documentation/CoreMedia/Reference/CMTime/index.html中有文档记录。你也可以在Swift源文件中对类型或方法进行cmd-click(例如,在CMTime上),这将带领你到Swift定义的相关方法。 - Martin R

2

CMTime是一个结构体,包含值、时间刻度、标志和时期。因此,您不能仅仅将它“转换”为浮点数值。

您可以通过直接编写以下方式来使用该值

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

但是这只会给出以毫秒为单位的玩家数值。要以秒为单位获取数值,您可以使用以下方法:

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

请注意,这可能不是您正确获取滑块值的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接