使用Swift语言从xCode获取编译错误消息:"调用"中的额外参数userinfo。问题是如何使用userInfo数据从计时器到参数" userInfo"在通知中心。
func onSetAudioWithTrackIndex(CurrentTrackIndex:Int, urlAudio: String){
........
//try to pass currentTrackIndex data to timerfire
playTimeClock = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "onSetPlayProgressTime:", userInfo: CurrentTrackIndex, repeats: true)
}
//Timerfire
func onSetPlayProgressTime(timer: NSTimer){
var currentTime = mediaPlayer.currentPlaybackTime
var playDuration = mediaPlayer.duration
var trackIndexDict = ["trackIndex" : timer.userInfo]
................
if currentTime == playDuration{
NSNotificationCenter.defaultCenter().postNotificationName(MPMoviePlayerPlaybackDidFinishNotification, object: self, userInfo: trackIndexDict)
}
return
}
答案 0 :(得分:5)
Swift有时会给你一些奇怪的编译器错误,这相当于“有多个可能的选项,没有一个工作,所以这里有一个错误”。当它抱怨的那个不是你想要的那个时,这可能很奇怪
这就是为什么Swift经常告诉你某些东西“不是Int8”,即使这与你想要做的事情无关(呵呵,我试图连接两个字符串,Int8s有什么办法呢?什么? - 这是因为+
运算符的一个可能选项是使用Int8s,这就是它选择抱怨的那个。)
在这种情况下,postNotificationName
有多个重载版本,一个有1个参数,一个有2个,一个有3个(你想要的那个)。它们都不适合你提供的类型,所以它说“其中一个选项是一个带有2个参数的调用,你提供了3个,所以这不起作用,还有一个额外的参数”。
不幸的是,这真的很令人困惑,并且让你想到了实际上错误的气味。假设您剪切并粘贴了实际代码,看起来MPMoviePlayerPlaybackDidFinishNotification
中存在拼写错误,userInfo
参数标签后面缺少冒号。
(p.s。你不需要在返回void的函数的末尾显式地返回一个返回值,虽然它不会造成任何伤害)
答案 1 :(得分:2)
在swift 3中,我遇到了同样的错误。当我将swift 2.2转换为swift 3时,由于语法被更改,因此它会抛出此错误。
斯威夫特3:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: trackIndexDict)
答案 2 :(得分:1)
问题是
userInfo
的{{1}}属性是可选:
NSTimer
以便var userInfo: AnyObject? { get }
具有不可转换的trackIndexDict
类型
正如[String : AnyObject?]
的最后一个参数所预期的那样[NSObject : AnyObject]
。
使用可选绑定,您可以"测试和解包"财产:
postNotificationName()
答案 3 :(得分:1)
谢谢,Martin,这个( NSTimer 的userInfo是可选的)是根本原因。随着以下变化。这可以修复
if let timerUserInfo: AnyObject = timer.userInfo! {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: ["trackIndex":timerUserInfo])
}