2016-04-28 28 views
1

私は一般的な方法で使用できるカスタムデータ構造を持っています。具体的には、getterを引数として渡したいので、数値プロパティで特定の関数を実行できます。これは私が次の基本パターンです(おもちゃの問題):Swiftの関数引数としてゲッターを渡す

/** A getter for a numeric property of a generic type. */ 
func genericGet<E, T where T: NumberConvertible>(object: E, getter: E -> T) -> T { 
    return getter(object) 
} 

struct EV : Linkable, Equatable, Comparable { 
    var pitch: Int 
    var ts: Double 
    var dur: Double 
} 

let anEvent = EV(pitch: 61, ts: 2.55, dur: 1.0) 

func getSomethingFromSomething<E, T: NumberConvertible>(thing: E, getThing: E -> T) -> T { 
    return myGet(thing, getter: getThing) 
} 

let somePitch = getSomethingFromSomething(anEvent, getThing: {$0.pitch}) 
print("pitch = \(somePitch)") // prints "61" 

ファンタスティック!私は私の一般的な構造体で同じアプローチをしようとすると、しかし:

struct MultiLink<E where E: Linkable, E: Equatable, E: Comparable> { 
    var item: E 
    var linkedItems: [E]? 

    func bestTransition<E, T: NumberConvertible>(getter: E -> T, scaling: Double) -> E? { 

     if let items = linkedItems { 
      let c = items.count 

      for i in 0..<c { 
       let linkedItem = items[i] 
       let itemProp = genericGet(item, getter: getter) // <--- sadness! 

       /** Yes, this is unfinished... */ 
      } 
     } 
     return nil 
    } 

    init(item: E, linkedItems: [E]?) { 
     self.item = item 
     self.linkedItems = linkedItems 
    } 
} 

コンパイラは文句:

多分私はちょうど別の「ゲッター」に至る「ゲッター」を渡すことによって、船外に行っていたことを考える
Spliqs.playground:86:57: error: cannot convert value of type 'E -> T' to expected argument type '_ -> _' 
      let itemProp = genericGet(item, getter: getter) 

、私も試みた:

let itemProp = getter(item) 

が妥当であると思わ(E以降 - > Tは、ゲッター署名である)、私は奇妙なエラー得た:

Playground execution failed: Spliqs.playground:70:32: error: cannot invoke 'getter' with an argument list of type '(E)' 
      let itemProp = getter(item) 
         ^
Spliqs.playground:70:32: note: expected an argument list of type '(E)' 
      let itemProp = getter(item) 

私は「奇妙な」と言っているので、ゲッターを呼び出すことができないということがわかりますし、ちょうどその方法(???)で呼び出す必要があると私に伝えています。私は見ていないばかげた何かをしていますか?

+0

ちょっと明確にするために、基本的なアプローチはこの質問から来ます:http://stackoverflow.com/questions/28944271/passing-property-type-as-parameter/28944642#28944642 – mrwheet

答えて

0

Quincey Morrisさん、アップルのデベロッパーフォーラムで問題が見つかりました。 bestTransition関数でEを再度指定すると、という別の Eが作成されました。これが原因で混乱するエラーが発生しました。それを削除すると、投稿されたコードが機能しました。

関連する問題