Swift 4等同于Kotlin“匿名类”表示法

时间:2018-07-31 11:59:49

标签: android ios swift kotlin

我已经在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)
    }
}

如果在进行一些魔术操作后重试-只需调用我的回调并返回:)

1 个答案:

答案 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)!")
}

防止样板代码。