swift 中闭包和函数作为参数的区别

2024-05-14

我有将近 4 年的 Objective C 经验,并且是 swift 的新手。我试图从 Objective C 的角度理解 swift 的概念。所以如果我错了,请指导我:)

在目标 c 中,我们有块(可以稍后异步执行的代码块),这绝对是完全合理的。但现在在 swift 中,我们可以将一个函数作为参数传递给另一个函数,该函数可以稍后执行,然后我们也有闭包。

As per Apple “函数是子句的特殊情况。”

As per O'Reilly “当函数作为值传递时,它会携带对外部变量的内部引用。这就是函数成为闭包的原因。”

所以我尝试了一下去理解同样的事情:)

这是我的结束语

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a ni

        let tempNumber : Int = 5

        let numbers = [1,2,3,4,5]
        print (numbers.map({ $0 - tempNumber}))
}

变量 tempNumber 甚至在声明闭包之前就已声明,但闭包可以访问该变量。现在,我尝试使用传递闭包作为参数的自定义类,并尝试执行相同的代码,而不是地图:)虽然现在闭包在不同的范围内执行,但它仍然可以访问 tempNumber。

我的结论是:闭包可以访问与闭包本身在同一范围内声明的变量和方法,尽管它是在不同的范围内执行的。

现在不再将闭包作为参数传递,而是尝试将函数作为参数传递,

class test {
    func testFunctionAsParameter(testMethod : (Int) -> Int){
        let seconds = 4.0
        let delay = seconds * Double(NSEC_PER_SEC)  // nanoseconds per seconds
        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

        dispatch_after(dispatchTime, dispatch_get_main_queue(), {
             self.callLater(testMethod)
        })
    }

    func callLater(testMethod : (Int) -> Int) -> Int {
        return testMethod(100)
    }
}

在另一个类中,我创建了一个 Test 实例并按如下方式使用它

/* in differrent class */
    override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a ni

            let tempAge : Int = 5

            func test2(val : Int) -> Int {
                return val - tempAge;
            }

            let testObj = test();
            print(testObj.testFunctionAsParameter(test2))
        }

声明了一个名为 test 的类,该类有一个名为 testFunctionAsParameter 的方法,该方法又调用另一个名为 callLater 的方法,最后该方法执行传递的函数:)

现在所有这些马戏团,只是为了确保传递的方法在不同的范围内执行:)

当我执行上面的代码时:)我震惊地发现,即使作为参数传递的函数最终在不同的作用域中执行,仍然可以访问在与方法声明相同的作用域中声明的变量 testNumber :)

我的结论是:O'Reilly 的说法“当函数作为值传递时,它会携带对外部变量的内部引用。”很受欢迎:)

现在我的疑问是苹果说函数是子句的特殊情况。我认为特殊情况一定与作用域有关:)但令我惊讶的是代码显示闭包和函数都可以访问外部作用域中的变量!!!!

除此之外,语法差异闭包与作为参数传递的函数有何不同???现在内部肯定有一些差异,否则Apple不会花那么多时间来设计它:)

如果没有范围??那么闭包和功能还有什么不同? O'Reilly 指出“当函数作为值传递时,它会携带对外部变量的内部引用。这就是函数成为闭包的原因。”那么它想指出什么呢?该闭包不会引用外部变量?现在他们也不会错了,不是吗?

我对 Apple 和 O'Reilly 的两个相互矛盾的声明感到生气:( 请帮忙,我理解有问题吗??请帮助我理解其中的区别。


在 swift 中,函数和闭包之间确实没有任何区别。闭包是一个匿名函数(没有名称的函数。)就是这样,除了您注意到的语法差异之外。

在 Objective-C 中,函数和块/闭包是不同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swift 中闭包和函数作为参数的区别 的相关文章

  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • iOS SecItemCopyMatching RSA 公钥格式?

    我正在尝试从已生成的密钥对 两个SecKeyRefs 以便通过线路发送 我所需要的只是一个简单的 modulus exponent 对 它应该正好占用 131 个字节 模数为 128 指数为 3 但是 当我获取关键信息时NSData对象 我
  • 从软件查找服务返回无效结果

    我尝试通过 XCode 组织者提交 iOS 应用程序 但在身份验证后失败 组织者说 从软件查找服务返回的结果无效 我怎么解决这个问题 检查 iTunes Connect 中您的应用程序状态是否为 等待上传 您可以更改状态以按 准备上传二进制
  • Draggable Boxview 不更新 Xamarin

    我的第一个问题是框视图生成在左上角 而不是我指定的设计网格第 10 行和网格第 3 列 第二个问题在于可拖动视图 在代码本地可拖动视图的第一部分中 它正确地调用了触摸事件 但也许它没有在GUI中更新
  • 是否可以在 UML 中可视化一堆函数

    我正在改进一个使用类和函数文件 只是包含各种函数的 php 文件 的内容管理系统 例如 我有一堂课叫Admin以及一个功能文件 其功能包括显示管理员概述 创建新管理员 编辑现有管理员 删除管理员 函数文件使用类并执行 mvc 概念的可视化部
  • iOS 中系统日期更改后如何更改带有日期的标签?

    我有一个简单的查询 但不知道该怎么做 这就是我想要实现的目标 1 我有一个带有今天日期的 UILabel 即 29 04 12 2 在午夜 我希望该标签自行更新为 30 04 12 而无需更改视图或按任何内容 这是第2步 我不知道该怎么做
  • NSIndexpath.item 与 NSIndexpath.row

    有谁知道之间的区别NSIndexpath row and NSIndexpath item 具体来说 我在以下情况中使用哪一个 UITableViewCell tableView UITableView tableView cellForR
  • UILongPressGestureRecognizer 不起作用,但将其替换为 UITapGestureRecognizer 效果很好。为什么?

    我有一个UIImageView with a UILongPressGestureRecognizer无论我如何配置手势识别器 似乎都不会检测到长按手势 但是 如果我把它换成UITapGestureRecognizer that工作得很好
  • 如何为所有整数类型创建通用整数到十六进制函数?

    我想为所有整数类型创建一个整数到十六进制函数 对于1字节的Int8 它返回两个字母 例如0A 对于2字节的Int16 它返回四个字母 例如0A0B 对于8字节的Int64 它返回16个字母 例如0102030405060708 func h
  • Swift 1.2 可选外部变量?

    由于 Swift 无法访问编译变量 因此我创建了一个指向编译变量的 Objective C extern 变量 编译变量转换器 h extern NSString const NetworkApiBasicAuthUsername 编译变量
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • 如何使用呼叫目录扩展来识别应用程序中的来电?

    我正在研究callKit框架 我发现通过使用呼叫目录扩展 我们可以识别来电电话号码 我的问题是如何在 iOS 应用程序中实现呼叫目录扩展来识别来电详细信息 我在 Objective C 工作 让一个数 919876xxxxx 使用此方法添加
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • UINavigationBar 滑开而不是留在原处

    我创建了演示项目来展示问题 我们在 UINavigationController 中有两个视图控制器 MainViewController这是根 class MainViewController UIViewController lazy
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • 如何在多个视图中显示相同的导航栏?

    我可以为一个视图重现以下导航栏 但是 一旦我单击按钮后移至下一个视图 我就会丢失最右边的两个图标 搜索 个人资料 据我所知 从故事板设置导航项目通常是按视图进行的 我可以为每个视图复制这些项目 但我想知道是否有更好的方法来完成一次 是否有教
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • 使用自定义格式将字符串转换为 NSDate [重复]

    这个问题在这里已经有答案了 可能的重复 NSString 到 NSDate https stackoverflow com questions 1353081 nsstring to nsdate iPhone 如何将 yyyyMMddTh

随机推荐

  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 如何封装.NET无状态状态机

    我有一个项目 其中大部分是线性工作流程 我正在尝试使用 NET Statelesslibrary https github com dotnet state machine stateless充当工作流引擎 状态机 示例的数量有限 但我整理
  • 如何在我的 html 中使用 Flaticon 中的图标?

    我想给我的网站一些图标 现在我看到很多人使用Flaticon这个网站 我所做的就是在 CSS 中添加这样的内容 Font 1 font face font family Flaticon1 src url flaticon1 eot src
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 我如何移动粘性/捕捉 wpf 窗口

    当我移动 主 窗口时 我想移动两个或更多粘性窗口 我想做这样的事情 private void MainWindow PreviewMouseMove object sender MouseEventArgs e if e LeftButto
  • 将 Python 输入字符串限制为特定字符和长度

    我刚刚开始学习我的第一种真正的编程语言 Python 我想知道如何限制用户输入raw input特定字符和特定长度 例如 如果用户输入包含除字母之外的任何内容的字符串 我想显示一条错误消息a z 我想显示超过 15 个字符的用户输入之一 第
  • 在 WordPress 中使用自定义字段进行搜索

    我正忙于使用 WordPress 开发 Web 应用程序 我创建了一个带有一些自定义字段的自定义帖子 当我使用 WordPress 搜索框搜索帖子时 仅返回标题与搜索字符串匹配的帖子 我想在搜索域中添加自定义字段 我可以在 WordPres
  • 预乘 Alpha 合成

    我正在尝试实现预乘阿尔法混合 在本页 什么是颜色混合 https learn microsoft com en us previous versions windows xna bb976070 v xnagamestudio 41 它们确
  • 在读取正文之前拒绝 HTTP 请求

    我正在开发一个网站 用户需要上传一些非常大的文件 该网站是用 PHP 编写的 在某些情况下 我想根据标头拒绝文件 理想情况下 我想在收到标头后立即拒绝请求 而不读取正文 如果标头足以表明该文件应被拒绝 则没有理由读取 200M 的文件 此外
  • POSIX SH 构建循环变量,其元素包含空格

    这是我需要的代码 bin sh x1 a1 a2 x2 b1 b2 list SOMETHING for x in list do echo x done 以及我想要的输出 a1 a2 b1 b2 问题是 应该做什么SOMETHING是 我
  • PSQL [错误] - 值被识别为列

    前几天刚开始学习数据库 我遇到了这个问题 我的值被识别为一列 并且它吐出了一个错误 这是我的News table id bodyText url createdAt updatedAt 这是我在 psql 中运行的命令 INSERT INT
  • 术语 SSTable 和 LSM Tree 之间有什么区别

    这两个术语可以互换使用吗 我读过有关 SSTable 工作原理的文章 通常文章都会开始提到 LSM Tree 然而 它们似乎是同一件事 我什么时候应该使用一个术语而不是另一个术语 对于凡人来说 SSTables 和 LSM Trees 的最
  • ffmpeg:音频样本的字节顺序

    我使用 ffmpeg 的 avcodec 从我的 C 应用程序中的音乐文件中检索原始音频样本 对于我测试的文件 这些文件样本的字节序似乎是小字节序 但我想知道对于我尝试解码的所有文件是否总是如此 即来自 ffmpeg 的实现或至少它的体系结
  • 什么时候应该使用 XML 而不是 SQL? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 ASP.NET MVC Linq To SQL 进行验证:如何避免编辑生成的源?

    我正在阅读一些关于验证的文档ASP NET MVC 忽略那些建议重新发明轮子编写自己的验证逻辑的人 大多数文章提倡使用xVal或数据注释验证器 两者都允许通过装饰模型的属性 进行声明性验证 我想我会去xVal 因为它似乎是最受建议的 因此
  • 如何使用Shopify API更改订单的付款状态?

    我正在为我自己的 Shopify 商店构建 iOS 应用程序 我创建了一个私有应用程序 并使用 API 密钥和密码来调用以下格式的 API https apikey password hostname admin resource json
  • 使用python shelve跨平台

    我希望得到关于 Python 中的书架 数据库的一些建议 问题 我在 Mac 上创建了一个数据库 我想在 Windows 7 上使用该数据库 我使用 Python 3 2 MacOS 10 7 和 win 7 当我在 Mac 上打开并保存我
  • pip 安装 MySQL-python

    我正在尝试在 Mac OS 上安装 MySQLdb for Python 当我数字pip install MySQL pythonshell 返回这样的内容 Collecting MySQL python Using cached http
  • XAML 网格可见性转换?

    我有一个网格 其可见性绑定到我的视图模型中的属性 这一切都工作正常 网格正确地出现 消失 我的问题是 如何应用过渡 以便网格内容滑入 UI 边缘 而不是立即从屏幕上消失 当它可见时 它应该再次滑出
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的