2014-12-23 1 views
3

Получить сообщение об ошибке компиляции из xCode с языком Swift: «дополнительный аргумент userinfo в вызове». вопрос заключается в том, как использовать данные 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», хотя это не имеет никакого отношения к тому, что вы (да, я пытался объединить две строки, что с Int8s что-то связано?), потому что один из возможных вариантов для оператора + - это работать с Int8s, так что он выбирает жаловаться).

В этом случае postNotificationName имеет несколько перегруженных версий, один с одним аргументом, один с 2 и один с 3 (тот, который вы хотите). Ни один из них не соответствует типам, которые вы поставили, поэтому он говорит: «Один из вариантов - это вызов с двумя аргументами, и вы поставили 3, так что это не сработает, есть дополнительный аргумент».

К сожалению, это действительно довольно запутанно и избавляет вас от запаха того, что на самом деле не так. Предполагая, что вы вырезали и вставили свой фактический код, похоже, что в MPMoviePlayerPlaybackDidFinishNotification есть орфографическая ошибка, а метка аргумента userInfo отсутствует после нее.

(пс вам не нужно явно положить возвращение в конце функций, которые возвращают недействительным, хотя это не причинит никакого вреда)

+0

Благодаря скорости воздушной скорости, это указывало на меня в правильном направлении.В моем случае я использовал тип перечисления с String rawValues ​​для определения разных имен уведомлений, но забыл развернуть его до String: NSNotificationCenter.defaultCenter(). PostNotificationName (Notifications.MyNote1, object: nil, userInfo: ["myKey": myValue]), что дает мне ошибку Extra Argument. После того, как я развожу опцию перечисления на rawValue, например Notifications.MyNote1.rawValue, ошибка компиляции исчезла. – CodePlumber

1

Проблема заключается в том, что 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) 
    } 
} 
1

спасибо, Мартин, это (USERINFO из NSTimer не является обязательным) является основной причиной. с последующим изменением. это может быть исправлено

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

Восклицательный знак '!' В 'if let timerUserInfo: AnyObject = timer.userInfo!' Неверен, и код не должен компилироваться. Кроме того, разве это не то, что я предложил? (Обратите внимание, что вы можете «принять» полезный ответ, щелкнув по галочке *. Это означает, что проблема решена и дает вам некоторые точки репутации и автору ответа.) –

2

В быстром 3, я получил ту же ошибку. Когда я преобразовал быстрый 2.2 в swift 3, по мере того как синтаксис был изменен, поэтому он выдает эту ошибку.

Swift 3:

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