1

NSTimer を使用して、1 秒ごとに関数を繰り返します。scheduledTimerWithTimeIntervalメソッドのuserInfoパラメーターを使用します。この のデータを更新する必要がありますuserInfo

override func viewDidLoad() {
    super.viewDidLoad()

    NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "minus:", userInfo: ["number": 100], repeats: true)
}

func minus(timer: NSTimer) {
    var userInfo = timer.userInfo as! Dictionary <String, Int>
    println(userInfo["number"]!)
    userInfo["number"] = userInfo["number"]! - 1
}

出力されるものが 100 99 98 97 であることを願っています。しかし、コードを実行すると 100 100 100 100 が得られます。

関数minusが最初に実行されたとき、userInfo のデータを 100 から 99 に変更したと思います。しかしuserInfo、関数が 2 回目に実行されたとき、 のデータはまだ 100minusです。

userInfoのデータを更新するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

1

userInfoは読み取り専用であるため、ビルドエラー/クラッシュではないことに驚いています。

NSMutableDictionaryポインターを変更せずに、ポインターが指すオブジェクトの内容を変更するだけにすることもできuserInfoますが、実際にはインスタンス変数を使用する必要があります...

于 2015-06-04T13:43:39.470 に答える
1

タイマーの userInfo オブジェクトを変更することはできません。userInfo は読み取り専用プロパティです。したがって、明らかな回避策は、変更可能なオブジェクトを userInfo として保存することです。たとえば、NSMutableDictionary* または独自のクラスです。

ただし、不変の NSDictionary から始めて、それを Swift 辞書に変換しました。そうしないでください。格納されたオブジェクト、つまり NSMutableDictionary に直接アクセスする必要があります。

于 2015-06-04T13:43:46.477 に答える