我想实现一个类似于他们在Kotlin中可以对建设者做的事情的DSL:http://kotlinlang.org/docs/reference/type-safe-builders.html
这个想法是使用扩展方法作为函数参数,这样你就可以使用在你提供参数的闭包中扩展的类中的方法。基本上允许您将方法和变量注入闭包的范围。
在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'
}
有没有人有运气做类似事情,或者知道如何做到这一点?
答案 0 :(得分:0)
我不知道这是否是你要找的,但是
html {
$0.head
}
会编译并似乎产生预期的输出。
闭包只需要一个参数(这里使用简写
参数名$0
),它是HTML
的一个实例。它回来了
实例方法$0.head
作为类型() -> ()
的函数。