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)
私は「奇妙な」と言っているので、ゲッターを呼び出すことができないということがわかりますし、ちょうどその方法(???)で呼び出す必要があると私に伝えています。私は見ていないばかげた何かをしていますか?
ちょっと明確にするために、基本的なアプローチはこの質問から来ます:http://stackoverflow.com/questions/28944271/passing-property-type-as-parameter/28944642#28944642 – mrwheet