Apple的新编程语言Swift如何处理块和异步请求?

 mobiledu2502892717 发布于 2023-01-12 07:18

Cf Apple在Swift上的网页:https://developer.apple.com/swift/

Swift中的块是否像objective-c一样?它们是如何创建和调用的?

如何在Swift中执行异步请求?

在swift中创建与块相关的内存泄漏是否容易?如果是的话,你会如何避免它们?

2 个回答
  • Swift中的块称为闭包.它们的操作与块大致相同(虽然更灵活,但在更多地方运行).使用Swift中的闭包可以实现引用循环,并且可以通过闭包捕获列表来避免.

    "Swift为这个问题提供了一个优雅的解决方案,称为闭包捕获列表.但是,在您学习如何使用闭包捕获列表打破强引用循环之前,了解如何导致这样的循环是很有用的"

    摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l

    2023-01-12 07:37 回答
  • Swift等价的(Objective-)C块称为闭包.在Swift编程语言书中有一整章关于它们.

    根据您使用闭包的上下文,您可以使用非常简洁的语法声明/使用它.例如,一个带有签名的完成处理程序的方法(success: Bool, error: NSError) - > Void可以像这样调用:

    someMethod(otherParameters: otherValues, completionHandler:{ success, error in
        if !success { NSLog("I am a leaf on the wind: %@", error) }
    })
    

    还有一个尾随闭包语法,在闭包本质上提供流控制的情况下可以很好地读取.当你想要真正简短时,你可以删除参数名称(以可读性为代价,但在一些明显的情况下,如下所示).通常,return陈述也是隐含的.

    myArray.sort { $0 < $1 }
    let squares = myArray.map { value in
        value * 2
    }    
    

    Swift本身没有任何异步请求,所以你使用现有的API.但是,您可以使用尾随闭包语法:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        // do some async stuff
        NSOperationQueue.mainQueue().addOperationWithBlock {
            // do some main thread stuff stuff
        }
    }
    

    在大多数情况下,您不必担心使用Swift闭包创建引用循环,就像使用ObjC块一样.简单地说,捕获语义类似于"正常工作"你想要它的方式对于大多数东西,但足够不同,块/闭包使用的常见模式(例如调度到后台/主线程和引用self的属性)不会导致循环.

    但是,循环仍然是可能的,并且有一个解决方案.这个答案已经有点长了,所以请查看文档中的闭包强引用循环以获得完整的解释.

    2023-01-12 07:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有