我希望有一个类可以在运行时访问另一个类中的指定属性。我猜我可以将闭包或函数作为参数传递。例如:
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
答案 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方法更容易使用,而且正是我在这里推荐的。