输入输出参数与多返回值
使用 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 反馈 — 无需本地设置。