4

使用 Swift 语言从 xCode 获取编译错误消息:“extra argument userinfo in call”。问题是如何使用定时器中的 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

4 回答 4

5

Swift 有时会给你一些奇怪的编译器错误,这相当于“有多个可能的选项,但没有一个有效,所以这是其中一个有问题的地方”。当它抱怨的不是你想要的那个时,这可能很奇怪

这就是为什么 Swift 经常告诉你某些东西“不是 Int8”,即使这与你想要做的事情无关(嗯,我试图连接两个字符串,Int8 与任何事情有什么关系? – 这是因为+运营商可能的选择之一是在 Int8s 上工作,所以这是它选择抱怨的)。

在这种情况下,postNotificationName有多个重载版本,一个有 1 个参数,一个有 2 个,一个有 3 个(你想要的那个)。它们都不适合您提供的类型,因此它是说“其中一个选项是带有 2 个参数的调用,而您提供了 3 个,所以这不起作用,还有一个额外的参数”。

不幸的是,这真的很令人困惑,并且会让你忘记真正错误的气味。假设您剪切并粘贴了实际代码,看起来 中存在拼写错误MPMoviePlayerPlaybackDidFinishNotification,并且userInfo参数标签后面缺少冒号。

(ps 你不需要在返回 void 的函数的末尾显式地添加一个 return,尽管它不会造成任何伤害)

于 2014-12-23T13:12:33.610 回答
2

在 swift 3 中,我遇到了同样的错误。当我将 swift 2.2 转换为 swift 3 时,由于语法已更改,因此会引发此错误。

斯威夫特 3:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: trackIndexDict)
于 2017-01-16T08:53:12.457 回答
1

问题是 of 的userInfo属性NSTimer可选的:

var userInfo: AnyObject? { get }

所以它trackIndexDict的类型[String : AnyObject?]不能转换[NSObject : AnyObject]为的最后一个参数所期望的postNotificationName()

使用可选绑定,您可以“测试和解包”该属性:

if currentTime == playDuration {
    if let timerInfo: AnyObject = timer.userInfo {
        let trackIndexDict = ["trackIndex" : timerInfo]

        NSNotificationCenter.defaultCenter().postNotificationName(MPMoviePlayerPlaybackDidFinishNotification,
            object: self,
            userInfo: trackIndexDict)
    }
}
于 2014-12-23T13:17:33.053 回答
1

谢谢,马丁,这(NSTimer的用户信息是可选的)是根本原因。进行以下更改。这可以修复

if let timerUserInfo: AnyObject = timer.userInfo! {      
      NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: ["trackIndex":timerUserInfo])
}
于 2014-12-23T13:45:08.473 回答