2015-06-02 71 views
1

我希望有一個類可以在運行時訪問另一個類中的指定屬性。我猜測如果我通過一個閉包或函數作爲參數是可能的。例如:如何在Swift中聲明屬性名稱的函數參數

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 
} 

創建十

時不過是有一些語法,我可以在whereAmI只傳遞作爲函數名稱,然後通過getPosition?然後,在action方法我可以這樣做:

thing.pointFunction 
+0

什麼是「事」?它是一種類型還是需要使用多種類型? – ABakerSmith

+0

它將是一個固定類型的類X. – rghome

+0

如果你使它NSObject你可以使用KVC –

回答

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,這是一個稍微尷尬呢,還是你必須有兩個inits這樣的:

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

所以真的,在大多數情況下,使用{$0.whereAmI}的方法比curried方法更容易使用,正是我在這裏推薦的。

+0

幾乎可以工作,但我得到一個編譯器錯誤的實際thing.PointFunction調用。應該是什麼樣子? – rghome

+0

thing.pointFunction()。這是一個功能。你必須打電話給它。 –

+0

我錯過了一些東西。它不用括號進行編譯。說「東西沒有名爲pointFunction的成員」。對不起 - 有一個原因http://fuckingclosuresyntax.com存在。 – rghome

相關問題