2016-03-30 11 views
2

内のプロトコルを宣言私が持っている:スウィフト:Javaでは、クラス

public class Event { 

     public enum State { 
      PENDING, 
      UPCOMING, 
      ACTIVE, 
      FINISHED, 
      FAILURE 
     } 

     public interface Callback { 
      void onUpdated(); 
      void onStateChanged(State state); 
     } 

     private State state; 
     private Callback mCallback; 
    } 

は、どのように私はスウィフトに似たものを作成することができますか?私はクラス内でプロトコルを宣言できないようです。しかし、プロトコルを外に宣言すると、State enumにアクセスできなくなります。ありがとう。

私はあなたが次の例のようにclassName.[entity]を使用することにより、クラススコープのエンティティにアクセスすることができます

class Event { 

    protocol Delegate { 
     func onUpdated(); 
     func onStateChanged(state: State); 
    } 

    enum State { 
     case PENDING 
     case UPCOMING 
     case ACTIVE 
     case FINISHED 
     case FAILURE 
    } 

    var delegate: Delegate? 
} 
+0

あなたはそれが動作しませんが、あなたがこれまでに書いたスウィフトコードを含める必要があります。 – Valentin

+0

クラススコープのenum状態とクラスデリゲートを持つ必要があります。 – pvllnspk

答えて

3

のようなものを持ちたい:

protocol Callback { 
    func onUpdated() -> Void 
    func onStateChanged(state: MyClass.State) -> Void 
} 

class MyClass { 
    enum State { 
    case PENDING 
    case UPCOMING 
    case ACTIVE 
    case FINISHED 
    case FAILURE 
    } 

    private var state: State 
    private var mCallback: Callback 
} 

次に、あなただけのCallbackで、他のクラスを拡張することができますプロトコル:

class AnyOtherClass { 
    ... 
} 

extension AnyOtherClass: Callback { 
    func onUpdated() { 
    ... 
    } 
    ... 
} 
+0

コールバックを持つモデルオブジェクトがたくさんあるとどうなりますか?別の名前を付けて、普遍的な名前を付けることはできません。 ? – pvllnspk

+0

あなたは言い換えることができますか?私は申し訳ありません。 –

+0

f.e.私はMyClass1とMyClass2を持っているので、私はCallback1とCallback2を持っているべきですか? Javaで私はMyClass1.CallbackとMyClass2.Callbackを持つことができました – pvllnspk

1

アクセス可能いくつかの素朴なハンドラとEvent.State

/* delegate protocol */ 
protocol MyDelegate : class { 
    func onStateChanged(state: Event.State) ->() 
} 

/* default implementation of onStateChanged */ 
extension MyDelegate { 
    func onStateChanged(state: Event.State) { 
     print("State changed to: \(state)") 
    } 
} 

/* your events */ 
class Event { 
    enum State { 
     case Pending 
     case Upcoming 
     case Active 
     case Finished 
     case Failure 
    } 

    weak var delegate: MyDelegate? 

    var state : State { 
     didSet { 
      // call delegate 
      delegate?.onStateChanged(state) 
     } 
    } 

    init(state: State) { 
     self.state = state 
    } 
} 

使用例を使用してsがState

class EventHandler: MyDelegate { 
    var myEvent : Event 

    init(event: Event) { 
     myEvent = event 
     myEvent.delegate = self 
    } 
} 

class AnotherHandler: MyDelegate { 
    var myEvent : Event 

    init(event: Event) { 
     myEvent = event 
     myEvent.delegate = self 
    } 

    func onStateChanged(state: Event.State) { 
     if state == .Active { 
      print("Event is active") 
     } 
     else { 
      print("Event is not active") 
     } 
    } 
} 

/* example usage */ 
let handler1 = EventHandler(event: Event(state: .Pending)) 
let handler2 = AnotherHandler(event: Event(state: .Pending)) 

handler1.myEvent.state = .Active 
    /* prints "State changed to: Active" (uses default delegate function) */ 

handler2.myEvent.state = .Active 
    /* prints "Event is active" (uses custom delegate function) */ 
+0

詳細な回答をいただきありがとうございました。最初に出された回答を受け入れました。 – pvllnspk

+0

@pvllnspk助けて嬉しいです。 2つの異なるクラス(上記のハンドラ)は、 'MyDelegate'に準拠し、青写真デリゲート関数' onStateChanged(event:) 'のカスタムバージョンを実装するかどうかを選択できることに注意してください。 'MyDelegate'への拡張で定義されているように、デフォルト実装を使用します。 – dfri

+0

もう一度感謝します – pvllnspk

関連する問題