You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 22:15:04