调用中的额外参数 userinfo

Posted

技术标签:

【中文标题】调用中的额外参数 userinfo【英文标题】:extra argument userinfo in call 【发布时间】:2014-12-23 12:35:12 【问题描述】:

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

【问题讨论】:

您能否检查您的标签是否正确且完整?这是什么语言? 第一次在这里提出问题。更新了描述和标签。语言很快 复制/粘贴您的真实代码MPMoivePlayerPlaybackDidFinishNotification 之类的拼写错误或 userInfo ["trackIndex":timer.userInfo] 中缺少的冒号会使您的问题不清楚。 【参考方案1】:

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

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

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

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

(p.s. 你不需要在返回 void 的函数的末尾显式地添加一个 return,尽管它没有任何害处)

【讨论】:

感谢 Airspeed Velocity,这为我指明了正确的方向。在我的情况下,我使用带有 String rawValues 的枚举类型来定义不同的通知名称,但忘记将其解包为 String: NSNotificationCenter.defaultCenter().postNotificationName(Notifications.MyNote1, object: nil, userInfo: ["myKey":myValue] ),这给了我额外的参数错误。在我像 Notifications.MyNote1.rawValue 这样将 enum 选项解包为 rawValue 后,编译错误消失了。【参考方案2】:

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

斯威夫特 3:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: trackIndexDict)

【讨论】:

【参考方案3】:

问题是 NSTimeruserInfo 属性是一个可选

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)
    

【讨论】:

【参考方案4】:

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

if let timerUserInfo: AnyObject = timer.userInfo!       
      NotificationCenter.default.post(name: NSNotification.Name(rawValue: MPMoviePlayerPlaybackDidFinishNotification), object: self, userInfo: ["trackIndex":timerUserInfo])

【讨论】:

if let timerUserInfo: AnyObject = timer.userInfo! 中的感叹号! 错误,代码不应该编译。除此之外,这不正是我建议的吗? (请注意,您可以通过单击复选标记“接受”有用的答案。这将问题标记为已解决,并为您和答案的作者提供一些声誉积分。)

以上是关于调用中的额外参数 userinfo的主要内容,如果未能解决你的问题,请参考以下文章

调用中的额外参数 userinfo

SwiftUI:随机“调用中的额外参数”错误

为啥我在 Swift 中的初始化程序不断收到“调用中的额外参数”

Swift 中的额外参数调用

Swift 2中的“调用中的额外参数'错误'”错误[重复]

闭包调用中的额外参数