如何摆脱Swift结束$ 0?

假设我有一堂课:

class Test { func someMethod() {} init(closure:(Test)->Void) { closure(self) } } 

我可以用另一个类的另一个方法调用init(1)

 Test { $0.someMethod() } 

或者像这样(2)

 Test { t in t.someMethod() } 

是否有任何可能的解决方案,将允许编写完全相同的东西,没有“$ 0”或“吨”? 我想得到这个代码(3)

 Test { someMethod() } 

行为必须完全符合(1)或(2)。

可能吗? 也许不是关闭,但有一些其他的Swiftfunction?

我想要做这样的Kotlintypes安全的生成器: http : //kotlinlang.org/docs/reference/type-safe-builders.html

不知道你在追求什么,但是我想知道这个巫术这个小点是否对你有用:

  class Test { var name : String init(_ name:String) {self.name = name} func someMethod() { println("Hi, my name is \(name)") } } let f = Test.someMethod let t1 = Test("matt") let t2 = Test("bealex") f(t1)() // Hi, my name is matt f(t2)() // Hi, my name is bealex 

要点是f(t1)本身就是一个函数,当被调用的时候,它向实例t1发送一些方法。 你可能会得到一些里程。

我相信在Swift中是不可能的,因为swift缺少某种动态扩展function

在swift中,扩展的唯一方法是定义一个新的函数(或其他),如:

 extension Type { func function() {} } 

所以就我所知,没有可能在运行中定义扩展。

所以我们真正缺少的是这样的:(愿意下一个版本的Swift?)

下面的代码将不起作用,它可以如何工作的例子

 class Test { var aVar = 0 func someMethod() {} // Param declares function as an extension on type Test! class func initialize(closure: Test.()->Void) -> Test { let instance = Test() instance.closure() return instance } } // And it would be possible to do: Test.initialize { self.someMethod() aVar = 1234 // With or without self, with or without self... } 

再次,不工作。 但是,哦,这是多么好…

更新:代码是一点,现在修复。

你必须满足types检查。 所以typechecker希望你写封闭是Test -> Void 。 如果你不使用Test参数,你可以像这样忽略它:

 Test { _ in someAnotherMethod() } 

编辑:我完全误解你的问题@bealex。 现在我有另一个解决方案,但它是丑陋的,它有一些限制。 这是代码

 class Test { init (_ f: Test -> () -> Void) { f(self)() } func doSomething() { println("Hello world") } } let test = Test(Test.doSomething) 

这只适用于不采用(或者void )参数的方法。 这是如何工作的:Swift实例方法是curried函数,第一个参数是self 。 链接

例如,取一个参数的方法,我们可以写交换方法,交换函数的参数顺序。

 func swap(f: A -> B -> C) -> B -> A -> C { return { b in { a in f(a)(b)} } } 

现在我们可以写

 class Test { init (_ f: Test -> Void) { f(self) } func doSomethingWithNumber(number: Int, str: String) { println("Hello planet \(number), \(str)") } } let test = Test(swap(Test.doSomethingWithNumber)(10, "Greetings")) 

但是这比使用纯$0 and $1更冗长。 无论如何,这是另一个角度。