swift inout 参数是变量还是指针?

2024-01-08

在下面的代码中使用 swift inout 参数我感觉有点迷失:

var shouldContinue: Bool = true

func doSomeWork1(shouldContinue: inout Bool)
{
    while shouldContinue
    {
        // ERROR: the compiler wants: doSomeWork2(shouldContinue: &shouldContinue)
        doSomeWork2(shouldContinue: shouldContinue)
    }
}

func doSomeWork2(shouldContinue: inout Bool)
{
    while shouldContinue
    {

    }
}

为什么编译器想要doSomeWork2(shouldContinue: &shouldContinue)代替the compiler wants: doSomeWork2(shouldContinue: shouldContinue)?不是shouldContinue已经是 doSomeWork1() 范围内的指针???


成为指针只是 inout 参数优化过程的副作用。他们实际上以不同的方式工作复制输入 复制输出行为。因此,在函数内部,该参数被视为常规变量,而不是指针。如果将其传递给另一个接受 inout 参数的函数,则必须将其标记为这样。

输入输出参数传递如下:

当函数被调用时,参数的值被复制。

在函数体内,副本被修改。

当函数返回时,副本的值将分配给原始参数。

这 行为称为拷入拷出或按值结果调用。为了 例如,当计算属性或具有观察者的属性是 作为输入输出参数传递,其 getter 被调用作为 函数调用及其 setter 作为函数返回的一部分被调用。

作为一种优化,当参数是存储在物理上的值时 内存中的地址,内部和外部使用相同的内存位置 在函数体之外。优化的行为称为调用 参考;它满足copy-in的所有要求 复制输出模型,同时消除复制的开销。编写你的代码 使用copy-in copy-out给出的模型,而不依赖于 按引用调用优化,以便它可以正确地使用或 没有优化。

输入输出参数 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545

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

swift inout 参数是变量还是指针? 的相关文章

随机推荐

  • 跨源子帧中表单控件的自动对焦被阻止

    使用 Chrome 当我尝试更改位于我们服务器上另一个应用程序的 IFrame 中的输入值时 我在 Chrome 中收到错误 在跨源子框架中阻止对表单控件的自动对焦 在生产中 当两个应用程序托管在同一域上时 它正在工作 但在本地主机开发中我
  • 如何发现 Spark 数据框中列格式的异常?

    正如问题所说 我想找到大型数据集中列中值格式的异常 例如 如果我在包含 5 亿行的数据集中有一个日期列 我想确保该列中所有行的日期格式为 MM DD YYYY 我想找到此格式中存在异常的计数和值 我该怎么做呢 我可以使用正则表达式吗 有人可
  • IOS Swift - 自定义相机覆盖

    你好 我想在我的应用程序中打开一个摄像头 如下所示 我想仅在该部分的中间打开相机 以便用户只能在矩形部分中拍摄快照 我正在使用的代码是这样的 import UIKit import AVFoundation class TakeProduc
  • python 中对象的 __init__() 方法做什么? [复制]

    这个问题在这里已经有答案了 在阅读 OpenStack 代码时 我遇到了这个问题 一个名为 Service 的类继承了基类 object 然后在Service的 init 方法 对象的 init 叫做 相关代码如下所示 类定义 class
  • 在 Selenium 2 中截取测试屏幕截图的最佳方式?

    我需要一种方法来截取功能测试的屏幕截图 现在我正在使用带有 C 绑定的 Selenium 2 我非常想在测试结束时截取屏幕截图 以确保显示所需的页面 你们知道有什么特定的工具可以合并到我的 C 代码中来触发屏幕截图吗 我找不到内置的 Sel
  • 检测 navigator.online 上的更改

    如何检测导航器是否将您的状态更改为在线 离线 就像是 var oldState navigator onLine window navigator onlinechange function evnt newState alert your
  • RPM 规范文件可以“包含”其他文件吗?

    RPM 规范中有一种 include 指令吗 我无法通过谷歌搜索找到答案 动机 我有一个 RPM 规范模板 构建过程会使用版本 修订版和其他特定于构建的数据对其进行修改 这是由sed现在 我认为如果规范会更干净 include特定于构建的定
  • 使用 javascript onClick 显示 Bootstrap Modal

    我需要能够使用以下命令打开 Twitter 引导模式窗口onClick 或类似的功能 只需要输入代码即可onClick 我正在尝试制作一个可点击的div打开模式 代码摘录 部门代码 div class span4 proj div 模态di
  • 如何在swift语言中使用CC_MD5方法

    在 Objective C 中 我们可以像这样对字符串进行哈希处理 const char cStr someString UTF8String unsigned char result 16 CC MD5 cStr strlen cStr
  • ASP.NET MVC 应用程序中的单例类或具有静态方法的类[重复]

    这个问题在这里已经有答案了 可能的重复 ASP NET 单例 https stackoverflow com questions 2134511 asp net singleton 我知道单例类和具有静态属性 方法的类之间的一般差异 但我想
  • UITextView字体为零

    我在故事板中创建了一个字体大小为 14 的 UITextView 并将其连接到 ViewController 的DetailDescriptionLabel 属性 这段代码在viewDidLoad中 self detailDescripti
  • 通过 fftw_mpi_r2c_2d 和 fftw_mpi_c2r_2d 输出不正确

    我编写了一个简单的测试程序 以便在 2d 域 使用 Fortran 中使用 MPI 实现 FFTW 该域的宽度为 Ny x Nx 并在第二个 x 索引中进行分区 在正确 我相信 声明和分配变量和计划之后 我调用 fftw mpi r2c 2
  • 最简单的源代码控制——你用什么?

    我正在开发一个独立项目 自己编写所有代码 因此不需要协作 但是 我确实需要以下功能 检查当前版本 并附上评论 为版本分配标签 使用标签检索版本 未托管 意味着我将存储库保存在本地计算机上 免费 开源 有一个漂亮的 GUI 而不是命令行 我认
  • 如果我读取键不存在的映射值,会发生什么情况?

    map
  • 在终结器中调用 GC.SuppressFinalize 是否无害?

    因为finalizer IDisposable以及所谓的 IDisposable模式 主题往往会带来大量故作姿态 武断和好战的观点 not 分别 here https stackoverflow com questions 36344293
  • 如何重置 Android Studio

    我想重置Android Studio 0 2 13到默认状态 这意味着重置所有设置 删除所有项目 所有 gradle 文件 以便它像全新安装一样 我必须遵循哪些步骤才能实现这一目标 我只知道如何在 Windows 上执行此操作 但在任何操作
  • SimpleDateFormat(String template, Locale locale),例如用于 ASCII 日期的 Locale.US

    Issue 直接使用 SimpleDateFormat 无需显式语言环境Id 简单日期格式 SimpleDateFormat format new SimpleDateFormat yyyy MM dd HH mm ss 为什么是 要获取本
  • 如何高效地将大数据加载到pandas中? [复制]

    这个问题在这里已经有答案了 我正在使用一个非常广泛的数据集 1005 行 590 718 列 1 2G 将如此大的数据集加载到 pandas 数据框中会完全由于内存不足而导致代码失败 我知道 Spark 可能是 Pandas 处理大型数据集
  • 在 Matlab 中对一维向量上的范围选择进行向量化

    这可能非常简单 但我无法弄清楚 我想创建一个范围矩阵 我可以使用以下循环来完成此操作 a 0 10 22 35 42 sample initial ranges for i 1 length a b i a i a i 5 end b 0
  • swift inout 参数是变量还是指针?

    在下面的代码中使用 swift inout 参数我感觉有点迷失 var shouldContinue Bool true func doSomeWork1 shouldContinue inout Bool while shouldCont