Подтвердить что ты не робот

NSTimer не находит селектор

Я хочу использовать NSTimer в классе, который не наследуется от UIViewVontroller. У меня есть 2 файла: ViewController и TimerClass:

ViewController:

import UIKit

class ViewController: UIViewController {

    var timerClass = TimerClass()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(animated: Bool) {
        timerClass.launchTimer()
    }

}

TimerClass:

import Foundation

class TimerClass {

    var timer = NSTimer()

    init(){}

    func launchTimer(){
        var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "timerEnd", userInfo: nil, repeats: true)
    }

    func timerEnd(){
        println("That worked")
    }
}

Когда я запускаю это приложение, у меня сбой:

2015-01-12 19: 48: 24.322 Timer_TEST [5829: 185651] *** NSForwarding: предупреждение: объект 0x7fbc3be20710 класса "Timer_TEST.TimerClass" не реализует методSignatureForSelector: - проблема впереди Непризнанный селектор - [Timer_TEST.supportFile timerEnd]

Любая идея?

Спасибо

4b9b3361

Ответ 1

EDIT: Обратите внимание, что, начиная с Swift 2.2, вы не сможете сделать эту ошибку! Вы будете использовать новый синтаксис #selector (см. fooobar.com/info/22333/...), и компилятор не позволит вам сформировать селектор для метода, который не отображается до Objective-C.


Это просто вопрос об открытии функции Swift Objective-C, чтобы она была видна Objective-C. У вас есть четыре варианта:

  • Создайте TimerClass из NSObject (и удалите реализацию init):

    class TimerClass : NSObject {
    
  • Объявить TimerClass с помощью @objc [не в Swift 2.0; используйте предыдущий выбор]:

    @objc TimerClass {
    
  • Объявите функцию с помощью @objc:

    @objc func timerEnd()
    
  • Объявите функцию dynamic (это, вероятно, самый худший вариант, поскольку это необязательно - функция не динамическая, ее не нужно изменять на месте Objective-C, она просто должна быть виден):

    dynamic func timerEnd(){