调用中的额外参数 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】:问题是
NSTimer
的 userInfo
属性是一个可选:
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的主要内容,如果未能解决你的问题,请参考以下文章