Swift中in与inout关键字的区别是什么
Swift 中
inout 关键字与「看起来的in关键字」的核心区别 首先需要明确:不存在单独作为参数修饰符的in关键字,你看到的两种带in的场景本质都和inout没有关联,是完全独立的语法规则。
1. 什么是 inout 关键字
- 定位:
inout是 Swift 官方定义的参数传递修饰符,用于实现按引用传递参数 - 特性:函数/方法内部可以修改被
inout修饰的参数,修改结果会同步到原始变量的作用域 - 用法示例:
// 定义带inout参数的函数 func increment(_ num: inout Int) { num += 1 } var count = 0 // 调用时需要在变量前加&符号 increment(&count) // 此时count的值变为1,修改同步到了原始变量
2. path(in:)中出现的in是参数标签,不是关键字
SwiftUI 中Shape协议的path(in:)方法里的in,只是方法的外部参数标签,仅用于提升调用时的可读性,和语法关键字没有任何关系:
- 该方法的完整签名是
func path(in rect: CGRect) -> Path,这里in是给外部调用者看的参数名,rect才是方法内部使用的参数名 - 这个参数是普通的只读值传递参数,你无法在方法内部修改
rect的值,修改也不可能影响外部变量 - 用法示例:
struct CustomShape: Shape { func path(in rect: CGRect) -> Path { // rect是只读输入参数,执行rect = .zero会直接编译报错 var path = Path() path.addEllipse(in: rect) return path } }
3. 另一种常见的in是闭包语法的分隔符
还有一种in出现在闭包语法中,用于分隔闭包的参数、返回值声明和闭包的实现代码,和参数修饰也没有关联:
// 闭包中in的用法 let sortedArray = [3, 1, 2].sorted { a, b in a < b }
核心区别总结
inout是参数传递规则的修饰符,标记参数按引用传递,允许修改后同步到外部原始变量- 方法参数标签
in是自定义的参数命名,仅用于提升调用可读性,对应参数为普通只读值传递,无法修改也不会影响外部 - 闭包分隔符
in是闭包语法的固定标记,仅用于分隔闭包声明和实现代码,和参数传递规则完全无关
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

