首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift中的“突变”函数和"inout“参数有什么不同吗?

在Swift中,"突变"函数和"inout"参数是用于修改函数中的参数的两种不同的方式。

  1. "突变"函数(mutating functions)是用于修改结构体和枚举中的属性的函数。当定义一个结构体或枚举中的函数需要修改其属性时,需要使用关键字"mutating"来修饰该函数。"突变"函数在函数内部可以修改调用该函数的结构体或枚举的属性值。

举例来说,假设有一个结构体Person,其中有一个"突变"函数changeName用于修改其属性name:

代码语言:txt
复制
struct Person {
    var name: String

    mutating func changeName(newName: String) {
        self.name = newName
    }
}

var person = Person(name: "John")
person.changeName(newName: "Mike")
print(person.name) // 输出 "Mike"
  1. "inout"参数是一种用于在函数内部修改函数外部传入的参数值的方法。通过将参数声明为"inout"类型,可以允许函数直接修改传入的参数,并且修改后的值在函数调用结束后保持有效。

举例来说,假设有一个函数swap用于交换两个整数的值,其中参数a和b都声明为"inout"类型:

代码语言:txt
复制
func swap(a: inout Int, b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var x = 10
var y = 20
swap(&x, &y)
print(x) // 输出 "20"
print(y) // 输出 "10"

区别:

  • "突变"函数主要用于修改结构体和枚举中的属性,而不会修改函数外部传入的参数。
  • "inout"参数用于在函数内部修改函数外部传入的参数值,可以用于修改任何类型的参数,不限于结构体和枚举的属性。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(云函数):https://cloud.tencent.com/product/scf
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 人工智能服务:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python列表Java数组什么不同

Python列表Java数组在多种编程语言中都是常见数据结构。虽然两者在某些方面有相似之处,但也存在许多显著区别。...下面将对Python列表Java数组进行比较,以帮助理解它们之间差异。 1、类型限制 Java数组具有固定数据类型,例如整数、字符或浮点数等。...而Python列表可以包含任何类型数据,如整数、字符串、布尔值、函数,甚至是其他列表元组等。虽然与Java不同,但这使得Python列表非常灵活。...6、内建函数方法 Python列表Java数组都有其自己一部分特定于该数据结构内置函数方法。Python提供了许多处理列表内置方法,如append()、pop()、remove()等。...它提供了许多帮助您方便地处理操作列表内置方法函数,并且可以容易地扩展。与之相比,Java数组在一定程度上更加受限制,不允许改变类型或大小。

15310

函数参数传值传指针什么区别?

前言 我们可能听过C语言中传值传指针,在其他语言中,也有传引用一说,那么他们到底什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。...因为函数参数在传递时候,都是传原数据副本,也就是说,swap内部使用ab只是最初始ab一个副本而已,所以无论在swap函数内部对ab做任何改变,都不会影响初始ab值。...值传递 首先图中方框上部分ab代表了main函数ab,即原始数据,而方框下部分ab代表了函数参数ab,即原始数据“副本”。...为什么又有传值,又有传指针 看到这里,不知道你是否会疑惑,为什么函数传递参数时候,一会是传值,一会是传指针呢?为什么传指针就能改变参数值呢?实际上,C语言里,参数传递都是值传递!...getMemory 总结 本文总结如下: 函数参数都是原数据“副本”,因此在函数内无法改变原数据 函数参数都是传值,传指针本质上也是传值 如果想要改变入参内容,则需要传该入参地址(指针引用都是类似的作用

3K30
  • Swift基础 内存安全

    Swift几种方法可以修改跨越几行代码值,从而可以在自己修改过程尝试访问一个值。 通过考虑如何更新写在纸上预算,您可以看到类似的问题。...内存访问特点 在相互冲突访问,内存访问三个特征需要考虑:访问是读还是写,访问持续时间被访问内存位置。...重叠访问主要出现在在函数方法或结构突变方法中使用内外参数代码。以下各节将讨论使用长期访问特定类型Swift代码。 对In-Out参数访问相互冲突 函数可以长期写入其所有输入输出参数。...使用playerOneScoreplayerTwoScore将其称为参数不会产生冲突——两个写入访问在时间上重叠,但它们访问内存不同位置。...在方法调用期间,对oscar写入访问权限,因为oscar是突变方法self值,并且有对maria写入访问权限,因为maria是作为进出参数传递。如下图所示,他们访问内存不同位置。

    9400

    深度模型优化(一)、学习纯优化什么不同

    下面关注一类特定优化问题:寻找神经网络上一组参数 ,它能显著降低代价函数 ,该代价函数通常包括整个训练集上性能评估额外正则化。...1、学习纯优化什么不同用于深度模型训练优化算法与传统优化算法在几个方面有所不同。机器学习通常是间接作用。在大多数机器学习问题中,我们关注某些性能度量P,其定义域测试集上并且可能是不可解。...监督学习, 是目标输出, 变量是 。不难将这种监督学习扩展成其他形式,如包括 或者 作为参数,或是去掉参数 ,以发展不同形式正则化或是无监督学习。...通常,提前终止使用真实潜在损失函数,如验证集上0-1损失,并设计为在过拟合发生之前终止。与纯优化不同是,提前终止时代理损失函数仍然较大导数,而纯优化终止时导数较小。...机器学习优化算法在计算参数每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数期望值。

    3.6K30

    【iOS 开发】NSError ** 与 throws 三个问题

    error 再获取这个错误值,来看这个过程中有没有什么错误,那么通过 error == nil 不就可以知道是否执行成功,为什么需要 BOOL 返回值,这是一个冗余设计?...上面那个方法在 Swift 是这样: func removeItem(atPath path: String) throws 没有返回值 Objective-C 为了对外部创建 NSError...赋值,使用了双指针设计,即 NSError *__autoreleasing*,这种做法在 Swift 语言中,变成了 inout 关键字: func swapTwoInts(_ a: inout Int..., _ b: inout Int) { let temporaryA = a a = b b = temporaryA } 这实现了在函数修改参数值,按照这种写法,是不是我们可以臆想出一种完全对应于..., error: inout NSError) -> Bool // 臆想版本 理论上或许可行,但是这里我臆想出这个版本, OC 这个方法设计,都是不好设计:为了方便,很多时候开发者会对 error

    1.9K20

    Swift4语法新特性 原

    首先,在Swift对内存访问读访问与写访问两种,例如: //读访问 var name = "jaki" //写访问 print(name) 在Swift4以前,程序对内存读写访问并没有严格控制...在开发,可能会产生读写权限冲突情况3种: 1.inout 参数读写权限冲突     一般情况下,值类型传参总会产生复制操作。inout参数则使得函数内可以直接修改外部变量值。...在函数inout参数从声明开始到函数结束,这个变量始终开启着写权限,对应上面代码,number参数开启这写权限,stepSize则进行了读访问,如此则满足上面的权限冲突规则,会产生读写冲突。...: inout Int) { var a = number+number2 } increment(&stepSize,&stepSize) 2.结构体自修改函数读写冲突     Swift...6.函数分内外两种参数名(外参数名可以省略)。 7.语法上支持便利构造方法。 8.语法层面支持懒加载。

    1.7K30

    故障诊断加速度、速度位移什么区别

    1.问题描述 为什么基于振动信号故障诊断,采集信号通常是加速度信号,而不是位移、速度信号呢? 看了一些旋转机械故障诊断文章,发现采集信号通常都是加速度信号。...自己也用位移信号和加速度信号比较着试了一下,加速度信号做出来效果的确要好。但是原因???还请知道大佬指教。...2.问题解答 这个取决于分析对象设备情况来定,目前从物理量上来解释,主要有位移,速度,加速度,而不同物理量对应着不同故障表现,它们关系简洁概括如下: 1、位移量适用于低频分析,一般对应着跟设备形变...、位移变化相关故障; 2、速度量适用于中频段分析,一般对应着设备疲劳损伤、点蚀类故障; 3、加速度适用于高频段分析,一般对应着冲击破坏类故障; 3.参考资料 https://www.zhihu.com.../answer/2615231764 http://www.52phm.cn 52phm 与工业互联网人一起成长 一个专注于工业智能预警系统研发,为机器设备健康运行保驾护航机器医生。

    1.2K40

    Swift系列三 - 函数

    函数在任何语言中都是存在Swift函数更加灵活。 一、函数定义 1.1....输入输出参数 可以用inout定义一个输入输出参数:可以在函数内部修改外部实参inout必须&配合使用 本质上是地址传递 可变参数不能标记为inout inout参数不能有默认值 inout...参数只能传入可以被多次赋值 如下修改会报错(因为形参是用let修饰) 使用inout& var number = 10 func add(_ num: inout Int) {...} 效果 三、函数重载 OC是不支持函数重载,但Swift支持函数重载 规则 函数名相同 参数个数不同 || 参数类型不同 || 参数标签不同 以下函数都构成了函数重载,都是可以正常调用,且函数没有冲突...、省略参数标签,函数重载一起使用产生二义性时,编译器可能会报错 为什么是可能会报错?

    37630

    Swift基础 通用

    通用解决问题 这里一个名为swapTwoInts(_:_:)标准非通用函数,它交换了两个Int值: func swapTwoInts(_ a: inout Int, _ b: inout Int)...注意 在所有三个函数,ab类型必须相同。如果ab不是同一类型,则无法交换它们值。Swift 是一种类型安全语言,不允许(例如)String类型变量类型Double变量相互交换值。...占位符类型名称没有说明T必须是什么,但它确实说ab必须是相同类型T,无论T代表什么。每次调用swapTwoValues(_:_:)函数时,都会确定代替T实际类型。...指定类型参数后,您可以使用它来定义函数参数类型(例如swapTwoValuesswapTwoValues(_:_:)函数ab参数),或作为函数返回类型,或作为函数主体类型注释。...第一个第二个要求在函数类型参数列表定义,第三个第四个要求在函数通用where子句中定义。 这些要求意味着: someContainer是C1型容器。

    10700

    Swift 3.0介绍

    编译器语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...,也因为Swift处于初级阶段,很多类库方法命名都尽量ObjC保持一致,在使用Swift开发iOS应用处处可以看到ObjC影子。...但是试想一下:Apple在很短时间内就固话API对于Swift发展真的是好事?毕竟新特性加入、更好语法优化才能让Swift越来越好!...总的来说,如果应用要升级到Swift3.0可能要做不同程度修改,但是这种改动仅仅是语法SDK变动并不会消耗太多工作量,更何况Apple提供了迁移工具。

    1.3K90

    Swift 3.0介绍

    编译器语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...,也因为Swift处于初级阶段,很多类库方法命名都尽量ObjC保持一致,在使用Swift开发iOS应用处处可以看到ObjC影子。...但是试想一下:Apple在很短时间内就固话API对于Swift发展真的是好事?毕竟新特性加入、更好语法优化才能让Swift越来越好!...总的来说,如果应用要升级到Swift3.0可能要做不同程度修改,但是这种改动仅仅是语法SDK变动并不会消耗太多工作量,更何况Apple提供了迁移工具。

    1.3K80

    swift 泛型

    占位类型名没有指明 T 必须是什么类型,但是它指明了 a b 必须是同一类型 T,无论 T 代表什么类型。...泛型函数非泛型函数另外一个不同之处,在于这个泛型函数名(swapTwoValues(::))后面跟着占位类型名(T),并用尖括号括起来()。...这个尖括号告诉 Swift 那个 T 是 swapTwoValues(::) 函数定义内一个占位类型名,因此 Swift 不会去查找名为 T 实际类型 //非泛型函数 func swapTwoInts...} 类型参数 类型参数指定并命名一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(例如 ) 多个类型参数,将它们都写在尖括号,用逗号分开 命名类型参数:通常使用单个字母来命名 始终使用大写字母开头驼峰命名法...Container 协议需要指定任何通过 append(_:) 方法添加到容器元素容器元素是相同类型,并且通过容器下标返回元素类型也是这种类型,为了达到这个目的,Container 协议声明了一个关联类型

    15010

    Swift基础语法(三)函数

    Swift函数在定义调用上都提供了更多更方便可操作空间,比如参数标签、可变参数,并且函数类型使用使得任意普通函数就有block特征,接下来认识Swift函数使用。...参数标签 Swift参数标签这个东西,我们常见参数名称是为了在函数内部更好语义化,而参数标签是为了再外界调用时有更好语义化 演示代码 //函数标签案例 func goToWork(at time...没有指针变量概念) (滑动显示更多) 说明: 不同于其他语言,Swift虚参只能是常量,不能是变量,所以无法修改 而且如果是值传递,也无法修改外部变量值 我们可以使用inout来修饰,就可以修改外部变量值...针对变量、指针地址区别使用以及在内存分布有比较清晰讲解 注意: 可变参数不可以加inout inout参数不可以默认值 3 函数类型认识 函数也有自己数据类型,数据类型就是参数数据类型...C函数函数重载一样,没什么特殊 函数重载方法名必须相同,参数必须不同 参数不同包括: 参数个数不同 参数类型不同 参数标签不同 注意: 返回值类型是否相同与函数重载无关 默认参数函数重载一起使用会产生二义性

    58230

    iOS-Swift 方法

    2. inout inout - 输入输出参数(In-Out Parameter)。可以用 inout 定义一个输入输出参数,可以在函数内部修改外部实参值。...inout 需要注意以下几个点: 可变参数不能标记为 inoutinout 参数不能有默认值。 inout 参数只能传入可以被多次赋值。...,sum 方法我们在 Swift 代码是没有任何参数,但在底层 SIL 实现,会默认有一个参数 - SHPoint,其实这个参数就是 SHPoint 实例 - self,这也是为什么我们在方法可以调用... sum 不同是,moveBy 传 SHPoint 前面有一个 inout。...三、类方法 我们已经了解了 Swift 结构体方法调用,那么 Swift 类呢?结构体一样,但不管结构体一不一样,肯定是 OC 类不一样。 1.

    3.1K40

    Swift3.0带来变化汇总系列三——函数闭包写法上微调

    函数方面,Swift3.0最大修改是修改了内部名称与外部名称默认规则。    ...在Swift2.2函数参数列表第一个参数如果开发者不手动设置外部名称,默认是匿名,除第一个参数以外其他参数,开发者如果不设置外部名称,默认外部名称是内部名称相同,因此在调用函数时,代码常常是这样...(1, param2: 2, param3: 3) Swift3.0将这一规则修改为:如果开发者不设置函数参数外部名称,则全部参数都默认外部名称内部名称相同,上面相同代码,在Swift3.0环境下是下面这样...param3是参数内部命名 param1+param2+param3 } //调用函数参数列表中使用param1、param2param3为外部命名 //swift3.0 myFunc5...在函数方面,Swift3.0另一项更改是关于inout参数声明方式,修改了inout关键字声明位置,Swift2.2与Swift3.0版本比如如下: //在函数内部修改参数变量值 //swift2.2

    50120

    Swift 进阶: 泛型

    一旦你指定了一个类型形式参数,你就可以用它定义一个函数形式参数(比如swapTwoValues(_:_:) 函数形式参数a b )类型,或者用它做函数返回值类型,或者做函数类型标注。...在不同情况下,用调用函数实际类型来替换类型形式参数。(上面的swapTwoValues(_:_:) 例子,第一次调用函数时候用Int 替换了T ,第二次调用是用String 替换。)...命名类型形式参数 ---- 大多数情况下,类型形式参数名字要有描述性,比如Dictionary Key Value ,借此告知读者类型形式参数泛型类型、泛型用到函数之间关系...return true } 这个函数两个形式参数,someContainer anotherContainer 。...如果它们元素数量不同,它们不可能匹配,函数就会返回false 。 检查完数量之后,用一个for-in 循环半开区间操作符(..< )遍历someContainer 所有元素。

    1.7K20

    Swift学习:泛型

    本篇将详细总结介绍Swift泛型用法; Swift泛型代码让你能够根据自定义需求,编写出适用于任意类型、灵活可重用函数及类型。它能让你避免代码重复,用一种清晰抽象方式来表达代码意图。...两个函数功能相同,唯一区别就是传入变量类型不同。...: 1.使用了占位类型名(T),来替换实际类型名(Int,Double); 2.占位类型符并不指定T必须是什么类型,但是却限制了参数ab必须是同一种类型T; 3.只有SwapTwoValues<...三、泛型类型 3.1.系统类型使用到泛型 事实上,泛型类型使用贯穿了Swift语言。例如,SwiftArrayDictionary都是泛型集合。...,并且这些来自原始类型参数名称会被用作原始定义类型参数引用。

    1.5K20
    领券