2014-11-02 1 views
1

Я хочу обновлять userInfo таймера в функции выбора при каждом срабатывании таймера.Изменение userInfo в функции выбора таймера в Swift

USERINFO:

var timerDic = ["count": 0] 

Таймер:

Init:  let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:  Selector("cont_read_USB:"), userInfo: timerDic, repeats: true) 

селектор функций:

public func cont_read_USB(timer: NSTimer) 
{ 
    if var count = timer.userInfo?["count"] as? Int 
    { 
    count = count + 1 

    timer.userInfo["count"] = count 
    } 
} 

Я получаю ошибку на последней строке:

«AnyObject?» не имеет члена под названием 'subscript'

Что здесь не так? В Objective_C эта задача работала с NSMutableDictionary в userInfo

ответ

4

Чтобы сделать эту работу, объявить timerDic как NSMutableDictionary:

var timerDic:NSMutableDictionary = ["count": 0] 

Затем в cont_read_USB функции:

if let timerDic = timer.userInfo as? NSMutableDictionary { 
    if let count = timerDic["count"] as? Int { 
     timerDic["count"] = count + 1 
    } 
} 

Обсуждение:

  • Swift словари являются типами значений, так что если вы хотите, чтобы иметь возможность обновлять его нужно передать объект. Используя NSMutableDictionary, вы получаете тип объекта, который передается по ссылке, и его можно изменить, так как это словарь mutable.

Полный пример для Swift 4+:

Если вы не хотите использовать NSMutableDictionary, вы можете создать свой собственный class. Вот полный пример использования пользовательских class:

import UIKit 

class CustomTimerInfo { 
    var count = 0 
} 

class ViewController: UIViewController { 

    var myTimerInfo = CustomTimerInfo() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     _ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: myTimerInfo, repeats: true) 
    } 

    @objc func update(_ timer: Timer) { 
     guard let timerInfo = timer.userInfo as? CustomTimerInfo else { return } 

     timerInfo.count += 1 
     print(timerInfo.count) 
    } 

} 

При запуске в симуляторе, то count, напечатанный увеличивается каждый второй.

+0

Это не сработало для меня. –

+0

@AdrianBartholomew, я просто попробовал это в приложении с Xcode 9.2 (последним) и Swift 4, и это сработало. Мне пришлось использовать 'Timer' вместо' NSTimer' и добавить '@ objc' в функцию обновления таймера, но это сработало. Какие симптомы вы видите? – vacawama

0

NSTimer.userInfo имеет тип AnyObject так что вам нужно, чтобы бросить его к целевому объекту:

public func cont_read_USB(timer: NSTimer) 
{ 
    if var td = timer.userInfo as? Dictionary<String,Int> { 
     if var count = td["count"] { 
      count += 1 
      td["count"] = count 
     } 
    } 
} 
+0

Обратите внимание, что это изменяет только локальный словарь 'td', а не свойство' timerDic' (так что счетчик будет равен нулю при каждом вызове *) –

+0

@MartinR: Вы правы, передавая ссылку на ' Для этого понадобится свойство timerDic'. Лучше изменить сам объект свойства. – zisoft

 Смежные вопросы

  • Нет связанных вопросов^_^