我已经在Kotlin中写了一段时间了,我习惯于使用下一个模式:
variable.addSomething(object: TargetType() { ...code... })
或
var variable = object: TargetType() { ...code... }
(如果我没有丢失任何东西)
是否可以在Swift中以某种方式使用此模式?怎么称呼它? :)
修改: 我真正想做的是-将预配置的RxSwift.SingleEvent存储在对象内部的let / var中,并在以后多次重用。
在代码中,正如我想象的那样,它应该像这样:
private var observer = SingleEvent<Response>(ok_callback, error_callback) {
override success(el: Element) {
ok_callback(el)
super.success(el)
}
override error(er: Error) {
self.onErrorRetry(er, callback)
}
}
如果在进行一些魔术操作后重试-只需调用我的回调并返回:)
答案 0 :(得分:0)
它似乎是 跟踪关闭 。改编自Swift programming language - Closures:
如果您需要将闭包表达式作为函数传递给函数 函数的 final参数,并且闭包表达式很长,它可以 将其写为尾随闭包很有用。尾随 闭包是在函数调用的括号后写的,即使 它仍然是该函数的参数。使用尾随时 闭包语法,您无需将闭包的参数标签写为 函数调用的一部分。
让我们对其进行编码:
简单地说,您要做的就是创建一个函数,其最后一个参数是闭包:
func doSomething(firstParameter: Any, closure: () -> Void) { }
因此您可以将其称为:
doSomething(firstParameter: "whatever") {
// ...
}
没什么特别的,它是从Swift语言到“尾随” closure
参数的一个很酷的功能,如果它是函数签名中的最后一个。
在初始化的情况下,几乎是相同的:
struct MyObject {
init(firstParameter: Any, closure: () -> Void) { }
}
let variable = MyObject(firstParameter: "whatever") { }
当然,此模式后面还有该语言中的许多其他功能,但这是Dictionary的merge
方法的示例,您可以认识到如何用一种以上所述的方式键入它Map Dictionary Keys to add values - Swift的答案。
更新:
如果您打算将其用作常量/变量(例如要传递给函数),则可以这样做:
let variable: (String) -> Void = { name in
print("The name is: \(name)!")
}
在这一点上,variable
类型为(String) -> Void
,这意味着其常量可以传递到其他地方。请考虑以下方法:
func doSomething(closure: (String) -> Void) {
closure("Nikita")
}
由于doSomething
的参数类型为(String) -> Void
,因此您可以这样做:
doSomething(closure: variable) // The name is: Nikita!
与其将其称为:
doSomething { name in
print("The name is: \(name)!")
}
防止样板代码。