Ios 如何在Swift中使用扩展方法作为参数?
我想实现一个DSL,类似于他们在Kotlin中对构建器所能做的: 其思想是使用扩展方法作为函数参数,这样您就可以在给定参数的闭包中使用正在扩展的类中的方法。本质上允许您将方法和变量注入闭包的范围 在斯威夫特看来这几乎是可能的,但也许我遗漏了什么。以下代码一直有效,直到我尝试在闭包中调用Ios 如何在Swift中使用扩展方法作为参数?,ios,swift,swift2,Ios,Swift,Swift2,我想实现一个DSL,类似于他们在Kotlin中对构建器所能做的: 其思想是使用扩展方法作为函数参数,这样您就可以在给定参数的闭包中使用正在扩展的类中的方法。本质上允许您将方法和变量注入闭包的范围 在斯威夫特看来这几乎是可能的,但也许我遗漏了什么。以下代码一直有效,直到我尝试在闭包中调用head(): // Class with method to be available within closure class HTML { func head() { prin
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'
}
有没有人有幸做过类似的事情,或者知道怎么做才可能?我不知道这是否是你想要的,但是
html {
$0.head
}
将编译并似乎生成预期的输出
闭包只接受一个参数(这里使用缩写)
参数名$0
),它是HTML
的一个实例。它回来了
实例方法
$0.head
作为类型函数()->
您可能会提到,这也发布在Apple开发者论坛上:。请原谅我的无知,但在这个上下文中什么是DSL?@MartinR domain specific language@ast您需要的是在作用域中“注入”对象html
,因此,可以通过self
关键字访问它。这是在Kotlin中完成的:html.op()
/reference/lambdas.html#extension function expressions AFAIK,这是Kotlin的一个+独特+功能,即使Scala也没有。@ast尝试使用函数实现类似于Kotlin的:inline fun with(receiver:t,f:t.()->R):R
我正在寻找的是一种避免初始$0的方法。扩展方法的一个关键特性是,它们可以直接访问它们扩展的类中的方法,但当用作闭包时,这种能力似乎丢失了。@ast:闭包不在HTML类或扩展声明的范围内,所以我不知道如何实现它。也许还有其他人。。。