调用中的额外参数userinfo

时间:2014-12-23 12:35:13

标签: swift timer notifications userinfo

使用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
}

4 个答案:

答案 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])
}