2015-09-30 32 views
0

我想實現類似,他們可以在科特林與建築工地做什麼DSL:http://kotlinlang.org/docs/reference/type-safe-builders.html如何在Swift中使用擴展方法作爲參數?

的想法是使用擴展方法作爲函數的參數,這樣就可以使用來自類的方法關閉之內被延長你給出一個論點。基本上允許你將方法和變量注入閉包的範圍。

它似乎是差不多可能在Swift中,但也許我錯過了一些東西。下面的代碼工作,直到正確我試圖關閉內部調用head()

// Class with method to be available within closure 
class HTML { 
    func head() { 
     print("head") 
    } 
} 

// Create a type with same signature as an extension method 
typealias ext_method = HTML ->() ->() 

func html(op: ext_method) { 
    let html = HTML() 
    op(html)() // call the extension method 
} 

html { 
    head() // ! Use of unresolved identifier 'head' 
} 

有任何人任何運氣做類似的東西,或有一個想法,怎麼會是可能的?

+1

您可能會提到這也發佈在Apple Developer Forum上:https://forums.developer.apple.com/thread/20481。 –

+0

請原諒我的無知,但在這種情況下,DSL *是什麼? –

+0

@MartinR域特定語言https://en.wikipedia.org/wiki/Domain-specific_language – matt

回答

0

我不知道如果這是你在找什麼,但

html { 
    $0.head 
} 

將編譯並似乎產生預期的輸出。

閉包採用一個參數(這裏使用簡寫 參數名稱$0),它是HTML的一個實例。它根據類型() ->()返回 實例方法$0.head

+0

我正在尋找的是一種避免最初的$ 0。擴展方法的一個關鍵特性是它們可以直接訪問它們擴展的類中的方法,但是當用作閉包時,該功能似乎會丟失。 – ast

+0

@ast:閉包不在HTML類或擴展聲明的範圍內,所以* I *看不到如何實現這一點。也許別人會...... –

相關問題