Swift Academy · 课时

输入输出参数与多返回值

使用 inout 修改参数,并通过元组返回多个值

第 3 / 4 课12 个步骤

输入输出参数与多返回值 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

欢迎

Swift 函数通常对值的副本进行操作。`inout` 参数允许函数直接修改调用者的变量。元组可以让函数一次返回多个值。

inout 关键字

将参数标记为 `inout`,即可修改原始值: ```swift func doubleInPlace(_ value: inout Int) { value *= 2 } var x = 5 doubleInPlace(&x) print(x) // 10 ``` 调用位置的 `&` 前缀表示该变量可能会被修改。

结构体中的 inout

```swift struct Point { var x: Double; var y: Double } func translate(_ p: inout Point, dx: Double, dy: Double) { p.x += dx p.y += dy } var origin = Point(x: 0, y: 0) translate(&origin, dx: 3.0, dy: 4.0) // origin is now (3.0, 4.0) ```

inout 的限制

• 常量(`let`)不能作为 `inout` 传递 • 字面量不能作为 `inout` 传递 • 如果下标和计算属性具有设置器,则可以作为 `inout` 传递 ```swift let c = 5 doubleInPlace(&c) // ❌ cannot pass let as inout ```

使用元组返回多个值

将多个值包装在元组中即可返回这些值: ```swift func minMax(of array: [Int]) -> (min: Int, max: Int) { (array.min()!, array.max()!) } let result = minMax(of: [3, 1, 7, 2]) print(result.min, result.max) // 1 7 ```

命名与未命名的元组元素

命名元素可以让元组自带说明: ```swift let named: (width: Int, height: Int) = (1920, 1080) print(named.width) // 1920 let unnamed = (1920, 1080) print(unnamed.0) // 1920 ``` 对于函数返回的元组,优先使用名称。

元组返回值解构

将元组返回值解包为多个变量: ```swift let (minimum, maximum) = minMax(of: [5, 3, 8]) print(minimum) // 3 print(maximum) // 8 ``` 使用 `_` 丢弃不需要的元素:`let (minimum, _) = minMax(of: arr)`。

可选元组返回值

在失败情况下返回 nil: ```swift func parse(_ s: String) -> (Int, Int)? { let parts = s.split(separator: ",") guard parts.count == 2, let a = Int(parts[0]), let b = Int(parts[1]) else { return nil } return (a, b) } ```

使用 inout 交换

使用 inout 实现经典的交换操作: ```swift func swap(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp } var m = 1, n = 2 swap(&m, &n) print(m, n) // 2 1 ``` Swift 标准库已经提供了 `swap(_:_:)`,因此无需自行编写。

何时使用 inout,何时返回值

相比修改 inout 参数,优先返回新值: ```swift // Prefer: func normalised(_ v: SIMD3) -> SIMD3 { v / v.magnitude } // Use inout only when mutation is expected API contract, e.g. algorithms on large arrays func sort(_ arr: inout [Int]) { arr.sort() } ```

快速检查

将变量传递给 `inout` 参数时,调用位置需要使用什么前缀?

回顾

要点: • `inout` 允许函数修改调用者的变量;传递时使用 `&` • 不能将 `let` 常量或字面量作为 inout 参数传递 • 元组可以整洁地返回多个值;为元素命名有助于提高可读性 • 解构元组:`let (a, b) = f()` • 优先返回新值;只有当修改是 API 契约的一部分时才使用 inout 下一节:将函数作为一等值使用。
免费开始

用 AI 导师学习 Swift — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
122
课程
409

常见问题解答

「输入输出参数与多返回值」课时是免费的吗?

是的 — 「输入输出参数与多返回值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「输入输出参数与多返回值」这节课中我会学到什么?

使用 inout 修改参数,并通过元组返回多个值 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「输入输出参数与多返回值」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 参数标签与参数名称
  2. 默认参数与可变参数
  3. 输入输出参数与多返回值
  4. 作为一等值的函数
← 返回 Swift Academy