Ответ 1
Хотя это не встроенная функция языка, может быть интересно отметить, что возможно реализовать стиль С# async
/await
для Swift и что из-за специального синтаксиса, предоставленного последнему аргументу закрытия вызова функции, он даже выглядит так, будто он может быть частью языка.
Если кому-то интересно, вы можете получить код для этого в Bitbucket. Вот быстрый пример того, что возможно:
let task = async { () -> () in
let fetch = async { (t: Task<NSData>) -> NSData in
let req = NSURLRequest(URL: NSURL.URLWithString("http://www.google.com"))
let queue = NSOperationQueue.mainQueue()
var data = NSData!
NSURLConnection.sendAsynchronousRequest(req,
queue:queue,
completionHandler:{ (r: NSURLResponse!, d: NSData!, error: NSError!) -> Void in
data = d
Async.wake(t)
})
Async.suspend()
return data!
}
let data = await(fetch)
let str = NSString(bytes: data.bytes, length: data.length,
encoding: NSUTF8StringEncoding)
println(str)
}
Кроме того, если вы хотите что-то вроде @synchronized, попробуйте следующее:
func synchronized(obj: AnyObject, blk:() -> ()) {
objc_sync_enter(obj)
blk()
objc_sync_exit(obj)
}
var str = "A string we can synchronise on"
synchronized(str) {
println("The string is locked here")
}