如何在Swift中声明一个属性名称的函数参数

时间:2015-06-02 18:11:44

标签: swift properties closures

我希望有一个类可以在运行时访问另一个类中的指定属性。我猜我可以将闭包或函数作为参数传递。例如:

class X {

    let pointFunction : (Thing) -> (CGPoint)

    init(pointFunction : (Thing) -> (CGPoint)) {
        self.pointFunction = pointFunction
    }

    func action(#thing : Thing) {
        var p = pointFunction(thing)
        ...
    }
}

class func getPosition(thing : Thing) -> CGPoint {
    return thing.whereAmI
}

然后在创建X时传递getPosition

但是有一些语法可以传递whereAmI作为函数名吗?然后,在我可以做的action方法中:

thing.pointFunction

1 个答案:

答案 0 :(得分:2)

你只需要一个Thing->CGPoint。函数文字与函数一样好:

let x = X(pointFunction: {$0.whereAmI})

如果你可以保证whereAmI方法而不是属性,那么你可以做一些其他技巧(参见http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/),但它只适用于方法。令人费解的是,IMO Swift属性不是方法。如果是,您可以通过Thing.whereAmI

那就是说,你必须改变你的init来取Thing -> () -> CGPoint,这有点尴尬,或者你必须有两个像这样的内容:

init(pointFunction : (Thing) -> (CGPoint)) {
    self.pointFunction = pointFunction
}
convenience init(pointMethod : Thing -> () -> CGPoint) {
    self.init(pointFunction: {pointMethod($0)()})
}

实际上,{$0.whereAmI}方法在大多数情况下比使用curried方法更容易使用,而且正是我在这里推荐的。