Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中使用扩展方法作为参数?_Ios_Swift_Swift2 - Fatal编程技术网

Ios 如何在Swift中使用扩展方法作为参数?

Ios 如何在Swift中使用扩展方法作为参数?,ios,swift,swift2,Ios,Swift,Swift2,我想实现一个DSL,类似于他们在Kotlin中对构建器所能做的: 其思想是使用扩展方法作为函数参数,这样您就可以在给定参数的闭包中使用正在扩展的类中的方法。本质上允许您将方法和变量注入闭包的范围 在斯威夫特看来这几乎是可能的,但也许我遗漏了什么。以下代码一直有效,直到我尝试在闭包中调用head(): // Class with method to be available within closure class HTML { func head() { prin

我想实现一个DSL,类似于他们在Kotlin中对构建器所能做的:

其思想是使用扩展方法作为函数参数,这样您就可以在给定参数的闭包中使用正在扩展的类中的方法。本质上允许您将方法和变量注入闭包的范围

在斯威夫特看来这几乎是可能的,但也许我遗漏了什么。以下代码一直有效,直到我尝试在闭包中调用
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类或扩展声明的范围内,所以我不知道如何实现它。也许还有其他人。。。