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

时间:2015-09-30 20:08:48

标签: ios swift swift2

我想实现一个类似于他们在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'  
}

有没有人有运气做类似事情,或者知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是你要找的,但是

html {
    $0.head  
}

会编译并似乎产生预期的输出。

闭包只需要一个参数(这里使用简写 参数名$0),它是HTML的一个实例。它回来了 实例方法$0.head作为类型() -> ()的函数。