2017-06-26 6 views
1

Swiftクラスのインスタンスから特定の名前の接頭辞を持つfuncの配列を、それらの関数の名前をハードコードしないで取得するにはどうすればよいですか?Swiftクラスインスタンス内のfuncの配列

class Dialog { 
    init() { 

    } 

    func stepOne(session: Session) { 
    ... 
    } 

    func stepTwo(session: Session) { 
    ... 
    } 

    func stepThree(session: Session) { 
    ... 
    } 

    func someOtherFunc() { 
    ... 
    } 

    func steps() -> [(Session) -> Void] { 
    // should return [stepOne, stepTwo, stepThree]; 
    } 
} 
+0

スウィフト自体にはそのような反射能力がないため、Obj-Cランタイムを掘り下げて調べる必要があります(ただし、その場合でも、機能の順序)。しかし、これは非常に脆いデザインのように思えます( 'stepsRemaining'プロパティを追加した場合、合成されたObj-Cゲッターセレクターには" step "という接頭辞が付きます) - 配列の指定に間違いはありません。 – Hamish

答えて

0

機能はどこかから来なければなりません。必ずしもDialogで定義する必要はありません。 func steps()のローカル変数にすることができます。たとえば、

func steps() -> [(Session) -> Void] { 
    var allSteps: [(Session) -> Void] = [] 
    for i in 0..<3 { 
     let currentStep: (Session) -> Void = { session in 
      print("Executing step \(i)") 
     } 
     allSteps.append(currentStep) 
    } 
    return allSteps 
} 
+0

私はこれらを保持するallSteps変数を持たないことを望んでいました。私は、XCTestに似た何かが欲しい、そこではすべてのfuncsがtestで始まるプレイングを実行する。私はちょうどfuncsの配列を代わりにしたい。 –

+0

ああ、正しいシグネチャ(つまり '(Session) - > Void')を持つクラスのすべての関数をプログラムで検索したいのですか? – Connor

+0

これはちょっとややこしいことですが、よく分からないことですが、探しているトピックは「リフレクション」とSwiftの「ミラー」クラスです:https://appventure.me/2015/10/ 24/swift-reflection-api-you-can-do / – Connor

関連する問題