【问题标题】:How translate to Swift an anonymous class of Java? [closed]如何将 Java 的匿名类转换为 Swift? [关闭]
【发布时间】:2015-12-26 01:05:41
【问题描述】:

我是 Swift 2 的新手,我从未在 Apple 开发过。 Objective C 看起来很丑,你必须写很多代码,所以 Swift 很喜欢,因为语法类似于 Java 和 C,我的问题是:

在Java中你可以这样定义一个类:

new Thread(){
  public run(){
      // anything    
  }
}.start();

那么,Swift 可以做到这一点吗?怎么做?

感谢和问候


解决方案

    let myThread=NSThread(target: self, selector: "backgroundWork", object: nil)
    myThread.start()

}

func backgroundWork(){

    for (self.counter=0;self.counter<10;self.counter++){
        //self.myLabel.text = String(self.counter) // Not update UI
        self.performSelectorOnMainThread( Selector("updateLabel"), withObject: nil, waitUntilDone: false )
        sleep(3)
    }

}

func updateLabel(){
    self.myLabel.text = String(self.counter)
}

【问题讨论】:

  • 这是一个匿名类,在 Java 8 中将使用 lambda 实现,而在 Groovy 和 Swift 中将使用 Closure 实现
  • 这是一个新的Thread-Object的初始化,而不是一个类的定义。
  • @Christian 定义了一个新的匿名类,继承Thread
  • 是的,是匿名类,谢谢 Andreas。解决了。​​
  • ...并以反对票感谢 Objective-C 程序员 ;)

标签: java multithreading swift anonymous


【解决方案1】:

大多数情况下存在这种语法(匿名类的内联定义)是因为 Java 不允许闭包或 lambda 函数的概念,所以如果你想传递一个要调用的函数,你必须传递一个带有然后函数声明为内联。

相比之下,Swift 与大多数现代语言一样具有特定的闭包语法,允许您直接将可执行块传递给另一个例程,本质上它允许您将函数视为一流的语言实体。

所以,底线是不,Swift 不允许您询问的构造,但它确实为主要用例提供了等效的功能。与您的示例最相似的代码是:

dispatch_async(...) {
    Code to be executed asynchronously here
}

这实际上只是语法糖:

dispatch_async(..., {
    Your code here
})

由于创建匿名对象只是作为单个对象的持有者,因此实际上不需要对象,或者实际上不需要类,因此也不需要语法。 Java 语法稍有优势的唯一情况是被调用者需要维护多个相关回调。

【讨论】:

  • 谢谢大卫,你的回答是对的 ;)
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多