2014-12-23 104 views
3

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

您可以检查标签是正确和完整的 - 例如,这是什么语言? –

+0

第一次在这里提出问题。更新的说明和标签。语言很快 – lotosn

+0

请*复制/粘贴*您的*真实代码*。像'MPMoivePlayerPlaybackDidFinishNotification'这样的输入或者'userInfo [“trackIndex”:timer.userInfo]中的一个冒号“会让你的问题不清楚。 –

回答

4

斯威夫特可以给你有时会稍显陌生编译器错误,就属于“有多种可能的选择,他们没有工作,所以这里是什么地方错了其中的一个。”当它抱怨的不是你想要的那个,这可能很奇怪

这就是为什么Swift经常告诉你某些东西是“不是Int8”,即使这与你的东西没有任何关系试图去做(呃,我试图连接两个字符串,Int8与什么有关? - 这是因为+运算符的可能选项之一是在Int8上工作,所以它是它选择抱怨的那个)。

在这种情况下,postNotificationName有多个重载版本,一个带有1个参数,一个带有2个,另一个带有3个(您需要的)。它们都不符合你提供的类型,所以它说“其中一个选项是带有2个参数的调用,并且你提供了3个,所以这是行不通的,还有一个额外的参数”。

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

(PS你不需要明确提出在返回void函数结束时返回,尽管它没有做任何伤害)

+0

非常感谢Airspeed Velocity,这表明我正确的方向。在我的例子中,我使用了一个带有字符串rawValues的枚举类型来定义不同的通知名称,但忘记将其解包为String:NSNotificationCenter.defaultCenter()。postNotificationName(Notifications.MyNote1,object:nil,userInfo:[“myKey”:myValue] ),这给了我额外的参数错误。将Notification.MyNote1.rawValue的enum选项解包为rawValue后,编译错误消失。 – CodePlumber

1

的问题是 是的NSTimeruserInfo属性是一个可选

var userInfo: AnyObject? { get } 

使trackIndexDict有型[String : AnyObject?]由的最后一个参数如预期是不可自由兑换 到。

随着可选结合可以 “测试,解开” 属性:

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

     NSNotificationCenter.defaultCenter().postNotificationName(MPMoviePlayerPlaybackDidFinishNotification, 
      object: self, 
      userInfo: trackIndexDict) 
    } 
} 
1

感谢,马丁,这(的USERINFO的NSTimer是可选的)是根本原因。与下面的变化。这是可以修复的

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

如果让timerUserInfo:AnyObject = timer.userInfo!'中的感叹号'!'错了,代码就不会编译。除此之外,这不正是我所建议的吗? (请注意,您可以通过点击*复选标记*来“接受”有用的答案,这表示问题已解决,并为您和答案的作者提供了一些声誉点。) –

2

在swift 3中,我得到了同样的错误。当我将swift 2.2转换为swift 3时,由于语法发生了变化,所以会引发此错误。

斯威夫特3:

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