如何将Swift转换为Java的匿名类?

时间:2015-09-28 17:49:48

标签: java multithreading swift anonymous

我是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)
}

1 个答案:

答案 0 :(得分:0)

大多数情况下,这种语法(匿名类的内联定义)存在是因为Java不允许闭包或lambda函数的概念,因此如果要传递要调用的函数,则必须传递类的实例然后使用函数声明内联。

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

所以,最重要的是,不,Swift不允许你提出的构造,但它确实为主要用例提供了相同的功能。与您的示例最相似的代码是:

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

这真的只是语法糖:

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

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