首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中将getter作为函数参数传递

在Swift中将getter作为函数参数传递
EN

Stack Overflow用户
提问于 2016-04-28 17:40:39
回答 1查看 427关注 0票数 1

我有一个自定义的数据结构,希望能够以通用的方式使用。具体来说,我希望传递一个getter作为参数,这样我就可以在一个数字属性上运行一个特定的函数。这是我所遵循的基本模式(玩具问题):

代码语言:javascript
运行
复制
/** 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"

太棒了!但是,当我在我的一般结构中尝试相同的方法时:

代码语言:javascript
运行
复制
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
    }
}

编译器抱怨:

代码语言:javascript
运行
复制
Spliqs.playground:86:57: error: cannot convert value of type 'E -> T' to expected argument type '_ -> _'
            let itemProp = genericGet(item, getter: getter)

考虑到我可能只是把"getter“传递到另一个"getter",所以我也尝试了:

代码语言:javascript
运行
复制
let itemProp = getter(item)

似乎是合理的(因为E -> T是一个getter签名),但我遇到了一个奇怪的错误:

代码语言:javascript
运行
复制
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)

我说“奇怪”是因为它告诉我它如何“不能”调用getter,然后告诉我我需要以这种方式调用它(?)。我是不是在做一些我没看到的蠢事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-02 22:38:58

Quincey Morris在Apple论坛上发现了这个问题。通过再次在bestTransition函数上指定E,我有效地创建了另一个E。这就是导致令人困惑的错误的原因。删除它会使发布的代码正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36921840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档