2015-01-12 5 views
10

UIViewVontrollerを継承しないクラスでNSTimerを使いたいです。そのようなのViewControllerとTimerClass:NSTimerがセレクタを見つけられません

の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") 
    } 
} 

私はそのアプリを起動すると、私はクラッシュを持っている:

私は2つのファイルを持っています

2015-01-12 19:48:24.322 Timer_TEST [5829:185651] *** NSForwarding:警告:クラス 'Timer_TEST.TimerClass'のオブジェクト0x7fbc3be20710がmethodSignatureForSelectorを実装していません: - 先にトラブル 認識できないセレクタ - [Timer_TEST.supportFile timerEnd]

ご存知ですか?

はありがとう

+0

私はSwiftについてほとんど知っていませんが、メソッドを要求していますが、カスタムクラスでは実装されていません...そうすることができますか? –

+0

'launchTimer'関数で' var timer'を使うべきではなく、 'timer'だけを使うべきです。 –

答えて

29

EDIT:スウィフト2.2で起動すると、あなたはこのミスを犯すことはできません注意!新しい#selector構文(https://stackoverflow.com/a/35658335/341994を参照)を使用すると、Objective-Cに公開されていないメソッドのセレクタをコンパイラで作成することはできません。


これは、Objective-CにSwift機能を公開してObjective-Cに表示されるようにするための単なる質問です。

  • がTimerClassを作るNSObjectのから派生(およびinit実装を削除):あなたは4つの選択肢を持っている

    class TimerClass : NSObject { 
    
  • ないスウィフト2.0で@objc [とTimerClassを宣言します。 ]の代わりに、前の選択肢を使用します。

    @objc TimerClass { 
    
  • @objcで関数を宣言:

    @objc func timerEnd() 
    
  • は、それが不要である(これは、おそらく最悪の選択をする機能dynamicを宣言 - 機能がですダイナミックではありません。Objective-Cによって変更する必要はありません。表示する必要があります。

    dynamic func timerEnd(){ 
    
+0

ありがとう、それはちょうど完璧です! – soling

+1

ありがとう、ありがとう。論理の説明は? – Rivera

+2

@リベラObjective-CがSwift機能を使用できるようにすることは単なる問題です。 Objective-Cに何らかの方法で意図的に公開する必要があります。私はいくつかのさらなるアプローチを提供するために私の答えを修正しました。 – matt

関連する問題