如何摆脱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
更冗长。 无论如何,这是另一个角度。