当前位置: 首页 > 知识库问答 >
问题:

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

邓阳嘉
2023-03-14

C、 f.苹果在Swift上的网页:https://developer.apple.com/swift/

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

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

在swift中创建与块相关的内存泄漏容易吗?如果是,您将如何避免它们?

共有3个答案

壤驷建德
2023-03-14

正如我在另一个问题中所说的,您可以通过多种方式传递与Swift中的函数等效的块。

我找到三个。

为了理解这一点,我建议您在操场上测试这段代码。

func test(function:String -> String) -> String
{
    return function("test")
}

func funcStyle(s:String) -> String
{
    return "FUNC__" + s + "__FUNC"
}
let resultFunc = test(funcStyle)

let blockStyle:(String) -> String = {s in return "BLOCK__" + s + "__BLOCK"}
let resultBlock = test(blockStyle)

let resultAnon = test({(s:String) -> String in return "ANON_" + s + "__ANON" })


println(resultFunc)
println(resultBlock)
println(resultAnon)

更新:匿名功能有2种特殊情况。

首先是函数签名可以被推断出来,所以你不必重写它。

let resultShortAnon = test({return "ANON_" + $0 + "__ANON" })

第二种特殊情况仅在块是最后一个参数时有效,称为尾随闭包

以下是一个示例(与推断签名合并以显示Swift威力)

let resultTrailingClosure = test { return "TRAILCLOS_" + $0 + "__TRAILCLOS" }

最后,举个例子:

使用所有这些功能,我要做的是混合尾随闭包和类型推断(为可读性命名)

PFFacebookUtils.logInWithPermissions(permissions) {
    user, error in
    if (!user) {
        println("Uh oh. The user cancelled the Facebook login.")
    } else if (user.isNew) {
        println("User signed up and logged in through Facebook!")
    } else {
        println("User logged in through Facebook!")
    }
}
连俊智
2023-03-14

Swift 中的块称为闭包。它们的操作与块大致相同(尽管更灵活,并且可以在更多的地方运行)。在 Swift 中使用闭包可以进行引用循环,使用闭包捕获列表可以避免引用循环。

“Swift为这个问题提供了一个很好的解决方案,称为闭包捕获列表。然而,在您学习如何用闭包捕获表打破强引用循环之前,了解这样的循环是如何引起的是很有用的”

摘自:苹果公司的《快速编程语言》。iBooks。https://itun.es/us/jEUH0.l

常哲彦
2023-03-14

(客观-)C 块的 Swift 等价物称为闭包。在《Swift 编程语言》一书中有一整章是关于它们的。

根据使用闭包的上下文,您可以用非常简洁的语法声明/使用它。例如,一个方法采用签名为的完成处理程序(成功:Bool,错误:NSError)-

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

还有一个尾随闭包语法,在闭包本质上提供流控制的情况下读起来很好。当你想真正简洁的时候,你可以去掉参数名(以牺牲可读性为代价,但是在一些明显的情况下是可以的,比如下面的例子)。通常< code>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 块一样。简单地说,捕获语义足够相似,可以按照您希望的方式“工作”,但差异很大,以至于块/闭包使用的常见模式(例如调度到后台/主线程和引用自我的属性)不会导致循环

然而,循环仍然是可能的,并且有一个解决方案。这个答案已经有点长了,所以请查看文档中的闭包的强参考周期以获取完整的解释。

 类似资料:
  • 问题内容: 参见Apple在Swift上的网站页面:https : //developer.apple.com/swift/ Swift中是否有像Objective-C一样的块?如何创建和调用它们? 如何在Swift中执行异步请求? 快速创建与块相关的内存泄漏容易吗?如果是,您将如何避免它们? 问题答案: (Objective-)C块的Swift等效项称为闭包。《The Swift Program

  • 本文向大家介绍苹果公司编程语言Swift语言简介,包括了苹果公司编程语言Swift语言简介的使用技巧和注意事项,需要的朋友参考一下 Swift 是一门新的编程语言,用于编写 iOS 和 OS X 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制。Swift 使用安全的编程模式并添加了很多新特性,这将使编程更简单,扩展性更强,也更有趣。Swift 支持 Co

  • 本文向大家介绍苹果公司推出的新编程语言Swift简介和入门教程,包括了苹果公司推出的新编程语言Swift简介和入门教程的使用技巧和注意事项,需要的朋友参考一下 一、Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language的原话: 简单的说: Swift用来写iOS和OS X程序。(估计也不会支持其它屌丝系统) Sw

  • 本文向大家介绍如果将axios异步请求同步化处理?相关面试题,主要包含被问及如果将axios异步请求同步化处理?时的应答技巧和注意事项,需要的朋友参考一下

  • 我意识到斯威夫特的书提供了一个随机数生成器的实现。在自己的程序中复制粘贴这个实现是最佳实践吗?或者有没有我们现在可以使用的库?

  • Swift 是编写程序的绝佳选择,无论是手机、电脑还是服务器,任何能跑代码的设备都是如此。它是一门集现代语言之大成,集结了苹果的工程师文化精髓以及开源社区多样化于一身的编程语言。编译器为专为性能所调优,语言专为开发所优化,二者绝不互相妥协。