2014-12-23 74 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)