Ich habe eine einfache Klasse, die init
Methode dauert eine Int und eine Callback-Funktion.Wie Callback-Funktionen in Swift übergeben
class Timer {
var timer = NSTimer()
var handler: (Int) -> Void
init(duration: Int, handler: (Int) -> Void) {
self.duration = duration
self.handler = handler
self.start()
}
@objc func someMethod() {
self.handler(10)
}
}
Dann in dem Viewcontroller ich habe dies:
var timer = Timer(duration: 5, handler: displayTimeRemaining)
func displayTimeRemaining(counter: Int) -> Void {
println(counter)
}
Dies nicht, ich folgende erhalten funktioniert:
'Int' is not a subtype of 'SecondViewController'
Edit 1: Hinzufügen von vollständigem Code.
Timer.swift
import UIKit
class Timer {
lazy var timer = NSTimer()
var handler: (Int) -> Void
let duration: Int
var elapsedTime: Int = 0
init(duration: Int, handler: (Int) -> Void) {
self.duration = duration
self.handler = handler
self.start()
}
func start() {
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
target: self,
selector: Selector("tick"),
userInfo: nil,
repeats: true)
}
func stop() {
timer.invalidate()
}
func tick() {
self.elapsedTime++
self.handler(10)
if self.elapsedTime == self.duration {
self.stop()
}
}
deinit {
self.timer.invalidate()
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
@IBOutlet var cycleCounter: UILabel!
var number = 0
var timer = Timer(duration: 5, handler: displayTimeRemaining)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func btnIncrementCycle_Click(sender: UIButton){
cycleCounter.text = String(++number)
println(number)
}
func displayTimeRemaining(counter: Int) -> Void {
println(counter)
}
}
ich mit Swift gerade erst begonnen, so bin ich sehr grün. Wie sollen Callbacks weitergeleitet werden? Ich habe mir Beispiele angesehen und das sollte funktionieren, denke ich. Wurde meine Klasse falsch für die Art und Weise definiert, wie ich den Rückruf übergebe?
Dank
Versuche 'self.displayTimeRemaining' vorbei . Swift benötigt möglicherweise einen expliziten Verweis auf die Instanzmethode, um Dinge zu disambiguieren. Ich weiß, das ist in anderen Sprachen üblich.(Leider habe ich keinen Mac handlich, so kann nicht testen, ob dies für Sie behebt.) – sapi
Hat nicht funktioniert. :(Das ist der Fehler jetzt: ''SecondViewController ->() -> SecondViewController!' Hat kein Mitglied namens 'displayTimeRemaining''. Ich frage mich, ob ich vielleicht die Funktion falsch im Controller deklariert habe? Ich habe die grundlegende Syntax Sie siehe oben im Code: – Fernando
sollten self.duration und self.start() in init() timer.duration und timer.start() sein? – davecom