Xcode 6- SWIFT- 将 CMTime 转换为浮点数

Posted

技术标签:

【中文标题】Xcode 6- SWIFT- 将 CMTime 转换为浮点数【英文标题】:Xcode 6- SWIFT- Cast CMTime as Float 【发布时间】:2014-09-17 15:22:07 【问题描述】:
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。

【问题讨论】:

【参考方案1】:

CMTime是一个结构,包含valuetimescale等字段, 所以你不能只是将它“转换”为浮点值。

还好有转换函数CMTimeGetSeconds()

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

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

let floatTime = Float(player.currentTime)

【讨论】:

是的,这行得通谢谢@Martin PS:将来有没有什么技巧可以让我自己解决这些问题? (当然除了在这里问:))我尝试阅读 CMTime 参考,但无法弄清楚。 @Abdou023:嗯,CMTimeGetSeconds() 记录在 developer.apple.com/library/prerelease/ios/documentation/… 中。您还可以在 Swift 源文件(例如,在 CMTime 上)中按住 cmd 键单击类型或方法,这会引导您进入 Swift 定义,然后您可以在其中找到相关方法。【参考方案2】:

CMTime 是一个结构,包含一个值、时间刻度、标志和纪元。因此,您不能只是将其“转换”为浮点值。

可以直接写来使用值

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

但这只会以毫秒为单位给出播放器的值。要以秒为单位获取值,请使用以下命令:

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

请注意,这也可能不是您应该拥有滑块值的正确方式。

【讨论】:

以上是关于Xcode 6- SWIFT- 将 CMTime 转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSTimeInterval 进行 CMTime 引用

如何将 Xcode 6.1.1 Swift 代码转换为 Xcode 6.4 Swift 代码?

将 xcode 6 beta 6 升级到 xcode 6 GM 种子后的 Swift 编译器错误

“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6

将发射器节点添加到 sks 文件并使用它 - XCode 6.0 + swift

在 Xcode 6 Swift 上插入声音