本节课主要学习 Button 按钮、print 输出调试信息,以及 Swift 函数。
这些内容是 SwiftUI 交互编程的基础。
按钮
按钮是我们最常见的 UI 控件,当我们需要下载、打开或者退出等操作时,通常都会点击按钮。
例如在 App Store 中,点击“获取”按钮下载 App。

在 SwiftUI 中,按钮使用 Button 表示。
基本用法:
Button("") {
}
结构可以分为两个部分:
Button("按钮文字") {
点击按钮时执行的代码
}
例如:
struct ContentView: View {
var body: some View {
Button("Start") {
}
}
}
运行后会显示一个 Start 按钮。

当用户点击按钮时,{} 内的代码就会执行。
需要注意的是:Button 属于 SwiftUI 的界面控件(View),因此必须写在 body 中。
buttonStyle 修饰符
在 SwiftUI 中,Button 提供了系统内置的按钮样式,可以通过 buttonStyle 修饰符使用。
例如:
Button("Start") {
}
.buttonStyle(.bordered)
buttonStyle 会使用系统提供的按钮样式。
常见的选项包括:
- .automatic
- .plain
- .bordered
- .borderedProminent
- .borderless

不同样式的区别主要体现在,按钮是否有边框、背景和视觉强调程度。
print 输出
在编程中,经常需要查看程序是否运行到某一段代码。
Swift 提供了 print 函数用于输出调试信息。
基本写法:
print("Hello")
这行代码会把文本输出到 Console(控制台)。
测试按钮可用性
我们可以把 print 写在按钮中,用来测试按钮是否被点击。
Button("Start") {
print("Test 123")
}
当点击按钮时,Console 会输出:
Test 123
这说明按钮已经成功触发。

注意:print 是 Swift 代码,不是界面控件。它不能直接放在 body 中,否则会报错。
例如,下面这样写就是错误的:
struct ContentView: View {
var body: some View {
print("Test 123") // 错误:body 必须返回一个 View
}
}
在 SwiftUI 中,body 用来描述界面结构,只能放界面控件(View),例如 Text、Button、Image 等。
普通代码(计算逻辑、print 等)必须放在按钮、函数或其他事件处理器中。
Console 控制台
print 输出的内容会显示在 Xcode 的 Console(控制台)中。
如果没有看到 Console,可以点击右下角的 Show the Debug Area 按钮打开调试区域,再点击 Show the Console 按钮显示控制台。

在 Console 左下角有两个标签:Executable 和 Previews。

这两个标签对应不同的运行环境:当在 Canvas 预览视图时,print 的输出会显示在 Previews 标签下;如果在模拟器或真机运行应用,则输出会显示在 Executable 标签下。
因此,当你发现 print 没有输出时,可以先确认自己选择了正确的标签。
案例 – ASCII 字符画
在一些代码项目中,经常会看到 ASCII 字符画。
字符画是用普通字符拼成的图案,例如:

我们可以使用按钮 + print 输出一个 ASCII 字符画。
示例代码:
struct ContentView: View {
var body: some View {
Button("Show ASCII") {
print(" /\\_/\\")
print("( o.o )")
print(" > ^ <")
}
.buttonStyle(.borderedProminent)
}
}
当点击按钮时,Console 会输出:
/\_/\
( o.o )
> ^ <
注意:字符串中的 \ 需要写成 \\\,因为反斜杠在字符串中是转义字符。
函数
在按钮中,我们可以直接编写代码。
例如:
Button("Start") {
print("Hello")
}
如果代码比较少,这样写没有问题。但是在实际开发中,一个按钮触发的逻辑可能很多。
例如:
Button("Start") {
print("Hello")
print("World")
print("This")
print("is")
// 可能还有很多代码
}
如果代码越来越多,直接写在按钮内部会让界面代码变得很乱,也不方便阅读和维护。
因此,我们通常会把这些代码整理到一个函数中,然后在按钮中调用这个函数。
什么是函数
函数就是一段可以重复使用的代码。
当某些代码需要被执行时,我们只需要调用这个函数,就可以运行函数内部的代码。
这样可以让代码结构更加清晰,也方便重复使用。
基本写法
在 Swift 中,函数使用 func 关键字定义:
func randomInt() {
// code
}
这段代码定义了一个函数。
randomInt 是函数名称,用来标识这段代码。
() 表示参数位置,可以在这里接收外部传入的数据。如果不需要数据,可以保持为空。
{} 内部就是函数的代码区域,所有需要执行的代码都写在这里。
例如:
func getName() {
print("FangJunyu")
}
这个函数的作用是输出一段文本。
调用函数
定义函数只是创建了这段代码,如果想要执行它,还需要调用函数。
调用方式是在函数名称后面加上 ():
getName()
当程序运行到这行代码时,就会执行 getName 函数中的代码。
完整示例:
func getName() {
print("FangJunyu")
}
getName()
运行后,Console 会输出:
FangJunyu
在 SwiftUI 中使用函数
在 SwiftUI 视图中,函数通常写在 body 外部。
例如:
struct ContentView: View {
func getName() {
print("FangJunyu")
}
var body: some View {
Button("getName") {
getName()
}
}
}
当点击按钮时,就会调用 getName() 函数。
这样可以让界面代码保持简洁,而具体逻辑放在函数中处理。
函数参数
有时候,一个函数需要根据不同的数据执行不同的操作。
例如,我们希望函数可以输出不同的名字,而不是只输出固定的”FangJunyu”。
这时就可以使用参数,参数可以理解为:调用函数时传入的数据。
例如:
func getName(name: String) {
print(name)
}
这个函数新增了一个参数,name 是参数名称,String 是参数类型。
这表示函数需要接收一个 String 类型的数据。
因为函数现在需要数据,所以在调用时必须提供这个数据。
getName(name: "Sam")
当调用时传入 “Sam”,函数内部就会使用这个值进行输出。
运行结果:
Sam
案例 – 使用函数输出 ASCII 字符画
在前面的示例中,我们把 print 直接写在按钮内部。
但如果字符画比较复杂,代码会变得很长。这时就可以把逻辑放到函数中,让界面代码更加清晰。
示例代码:
struct ContentView: View {
func printCat() {
print(" /\\_/\\")
print("( o.o )")
print(" > ^ <")
}
var body: some View {
Button("Show ASCII") {
printCat()
}
.buttonStyle(.borderedProminent)
}
}
运行后点击按钮,Console 会输出:
/\_/\
( o.o )
> ^ <
这里发生了两件事情,当用户点击按钮后:
1. 按钮调用 printCat() 函数
2. 函数中的 print 代码被执行
这样可以让界面代码只负责触发事件,而具体逻辑放在函数中处理。
在实际开发中,大部分按钮的操作都会通过函数来实现。
总结
本节课学习了三个重要内容:
1. Button 按钮
Button 是 SwiftUI 中用于触发操作的控件。
Button("Start") {
}
当用户点击按钮时,花括号中的代码会执行。
2.print 输出
print 用于向 Console 输出调试信息。
print("Hello")
开发者可以通过 Console 查看程序运行状态。
3.函数
函数是一段可以重复使用的代码。
func sayHello() {
print("Hello")
}
调用函数:
sayHello()
如果函数需要数据,可以使用参数:
func sayHello(name: String) {
print(name)
}
在后面的课程中,我们会继续学习更多 SwiftUI 控件以及数据如何与界面交互。
练习
尝试完成下面的练习:
- 创建一个按钮,按钮文字为 “Hello”
- 点击按钮时,在 Console 输出 Hello Swift
- 把输出代码写到一个函数中,然后在按钮中调用这个函数
