第一篇:启程 - 你的第一个 iOS 应用

欢迎来到激动人心的 iOS 开发世界!在这个智能手机几乎人手一部的时代,移动应用已经渗透到我们生活的方方面面,从社交、娱乐到工作、学习,无所不在。而 iOS,作为苹果公司打造的移动操作系统,凭借其流畅的用户体验、强大的性能、安全的生态以及庞大的高质量用户群体,始终是移动开发领域的热点。

你是否曾想过,自己也能创造出在 iPhone 或 iPad 上运行的精美应用?或许是一个记录灵感的笔记工具,一个分享生活点滴的社交平台,或者一个独具创意的小游戏?这听起来可能有些遥不可及,特别是如果你之前从未接触过编程或应用开发。但请相信,每一个复杂的应用,都是从最基础的第一步开始构建的。

本系列文章旨在为你——完全没有 iOS 开发经验或刚刚接触 Swift 语言的新手——铺平道路。我们将从零开始,一步步引导你搭建开发环境,学习必要的编程基础,并亲手创建你的第一个简单的 iOS 应用。

这第一篇文章,就是你的启程点。我们将一起:

  • 了解 iOS 开发的基本概念、魅力所在以及开始前需要准备什么。
  • 安装并熟悉核心开发工具 Xcode。
  • 快速掌握 Swift 语言中最核心、立即可用的基础知识。
  • 创建你的第一个 Xcode 项目,并了解其基本结构。
  • 动手构建一个经典的 “Hello, World!” 或一个简单的计数器应用。
  • 学会在模拟器上运行和调试你的应用。

准备好了吗?不要害怕那些看起来复杂的术语和代码,我们会用最浅显易懂的方式来解释它们。放下顾虑,带着好奇心,让我们一起推开 iOS 开发的大门,开启这段充满创造力的旅程!

一、iOS 开发概述:进入苹果的生态圈

在正式动手之前,让我们先花点时间了解一下我们即将探索的领域。

1. 什么是 iOS 开发?

简单来说,iOS 开发就是为运行 iOS 操作系统的设备(主要是 iPhone 和 iPad)创建应用程序(App)的过程。这涉及到使用苹果提供的开发工具和编程语言,遵循苹果的设计规范和开发框架,最终将你的创意转化为用户可以在设备上交互的软件。

除了 iPhone 和 iPad,苹果的生态系统还包括 watchOS (Apple Watch), tvOS (Apple TV), macOS (Mac 电脑)。虽然我们这个系列聚焦于 iOS,但你所学习的很多知识和技能(尤其是 Swift 语言和一些核心框架)同样适用于苹果其他平台的开发,为你未来扩展开发领域打下基础。

2. 为什么选择 iOS 开发?

市面上有多种移动操作系统,最主要的就是 iOS 和 Android。为什么很多开发者选择专注于 iOS 平台呢?

  • 庞大且高质量的用户群体: 全球有数以亿计的活跃 iOS 设备。更重要的是,通常认为 iOS 用户更愿意为高质量的应用付费,这为开发者提供了更可观的盈利潜力。
  • 统一的生态系统: 相比 Android 设备的多样化(不同厂商、屏幕尺寸、硬件配置),iOS 的设备种类相对较少,屏幕尺寸和硬件迭代更有规律。这使得开发者更容易进行适配和测试,保证应用在不同设备上都能有一致的良好体验。
  • 强大的开发工具和框架: 苹果提供了官方集成开发环境(IDE)Xcode,以及现代化、安全且高效的编程语言 Swift。同时,还有 UIKit 和 SwiftUI 两个强大的 UI 框架,以及用于处理网络、数据、多媒体、地图、机器学习等各种任务的丰富框架(Frameworks)。
  • 注重用户体验和设计: 苹果一直以其对设计细节和用户体验的极致追求而闻名。iOS 平台有一套成熟的设计指南(Human Interface Guidelines, HIG),鼓励开发者创造出美观、直观且易于使用的应用。这使得 iOS 平台上的应用整体质量较高。
  • 安全与隐私: 苹果对 App Store 的审核较为严格,并持续加强系统的安全性和用户隐私保护机制,这有助于建立用户信任,也为开发者提供了一个相对更安全、规范的开发环境。
  • 良好的盈利模式: App Store 提供了清晰的应用内购买、订阅等盈利模式,并且支付流程顺畅,用户付费习惯良好。

当然,选择 iOS 还是 Android(或者跨平台开发)取决于你的具体目标和兴趣。但不可否认,iOS 开发是一个充满机遇且回报丰厚的领域。

3. 技术栈概览

进行 iOS 开发,主要会接触到以下技术:

  • 编程语言: Swift: 这是苹果在 2014 年推出的现代化编程语言,也是目前 iOS 开发的主流语言。它以安全、快速、易读易写而著称,语法相比其前辈 Objective-C 更加简洁。我们这个系列将完全使用 Swift。
  • 集成开发环境 (IDE): Xcode: 这是苹果官方提供的唯一指定开发工具,集代码编辑、编译、调试、界面设计、性能分析、项目管理等功能于一身。你几乎所有的开发工作都会在 Xcode 中完成。
  • UI 框架: UIKit / SwiftUI:
    • UIKit: 是一个成熟、稳定且功能极其丰富的 UI 框架,多年来一直是构建 iOS 界面的标准方式。它基于类和对象的概念,通常与 Storyboard(可视化界面设计工具)或纯代码方式结合使用。
    • SwiftUI: 是苹果在 2019 年推出的声明式 UI 框架。它允许你用更简洁、更直观的 Swift 代码来描述界面应该是什么样子,系统会自动处理如何渲染和更新。SwiftUI 代表了 iOS UI 开发的未来方向,并且可以跨苹果所有平台使用。
    • 对于初学者,两者都可以作为起点。UIKit 历史更悠久,资源和成熟案例更多;SwiftUI 更现代,代码更少,学习曲线可能更平缓一些,但某些复杂场景下的资料相对较少。在本篇的实践环节,我们会简单展示两种方式。
  • 核心框架 (Frameworks): 除了 UI 框架,iOS SDK (Software Development Kit) 还包含了大量用于处理各种任务的框架,例如:
    • Foundation: 提供基础数据类型(如 String, Date, Data)、集合(Array, Dictionary)和操作系统服务。
    • Core Data: 用于数据持久化,管理应用的本地数据模型。
    • URLSession: 用于处理网络请求,与服务器进行数据交互。
    • MapKit: 用于集成地图和定位服务。
    • AVFoundation: 用于处理音频和视频。
    • 等等… 在后续的文章中,我们会接触到其中的一些。

4. 你需要什么?

开始 iOS 开发之旅,你需要准备以下几样东西:

  • 一台 Mac 电脑: 这是必需品。Xcode 只能运行在 macOS 操作系统上。无论是 MacBook Air, MacBook Pro, iMac, Mac mini 还是 Mac Studio 都可以。不需要追求最新最高配置,近几年发布的、能流畅运行最新 macOS 版本的 Mac 基本都能胜任初学阶段的开发任务。如果你暂时没有 Mac,可以考虑使用一些云 Mac 服务,但这通常需要付费且体验不如本地 Mac。虚拟机(黑苹果)虽然技术上可行,但存在稳定性和法律风险,不推荐。
  • Xcode: 这是免费的。你可以直接从 Mac App Store 下载和安装。确保你的 macOS 版本满足 Xcode 的最低要求(Xcode 会在 App Store 页面注明)。
  • Apple Developer Account (苹果开发者账号): 这个是可选的(初期)
    • 免费账号: 你只需要一个 Apple ID(就是你登录 iCloud 或 App Store 的账号),就可以在自己的真实 iPhone 或 iPad 上安装和测试你开发的应用。对于学习和开发阶段来说,这通常足够了。
    • 付费账号 (Apple Developer Program): 如果你想将应用发布到 App Store 让全球用户下载,或者想使用一些高级功能(如推送通知、CloudKit 等),则需要支付年费(目前是 99 美元/年)加入苹果开发者计划。在学习初期,你完全不需要付费账号。

总结一下,最核心的门槛就是一台 Mac 电脑。有了它和免费的 Xcode,你就可以开始学习 iOS 开发了。

二、开发环境搭建:熟悉你的工作台 Xcode

工欲善其事,必先利其器。Xcode 就是我们 iOS 开发的“瑞士军刀”,我们需要先安装它,并熟悉它的基本界面和功能。

1. 安装 Xcode

安装 Xcode 非常简单:

  1. 打开 App Store: 在你的 Mac 上,点击程序坞 (Dock) 上的 App Store 图标,或者通过 Launchpad 找到它。
  2. 搜索 Xcode: 在 App Store 的搜索框中输入 “Xcode”。
  3. 下载与安装: 找到 Xcode 应用(通常是第一个结果,开发者是 Apple),点击“获取”或云朵下载图标。如果之前下载过,可能是“安装”或“打开”。由于 Xcode 体积较大(通常几十 GB),下载和安装过程可能需要一些时间,具体取决于你的网络速度和 Mac 性能。请耐心等待。
  4. 启动 Xcode: 安装完成后,你可以在“应用程序”文件夹中找到 Xcode,也可以通过 Launchpad 启动它。首次启动 Xcode 时,它可能会提示安装额外的必需组件,按照提示同意并完成安装即可。

小贴士: 保持 Xcode 更新至最新稳定版本是一个好习惯,因为新版本通常会包含对最新 iOS 系统的支持、新的 SDK 功能以及 Bug 修复。你可以在 App Store 的“更新”标签页检查 Xcode 的更新。

2. Xcode 界面导览

第一次打开 Xcode,你可能会被它略显复杂的界面吓到。别担心,我们来分解一下,熟悉几个最常用的区域:

(建议:在阅读这部分时,实际打开 Xcode 随意创建一个新项目,对照着看效果更好)

当你创建一个新项目或打开一个现有项目后,Xcode 的主窗口大致可以分为以下几个核心区域:

  1. 工具栏 (Toolbar):

    • 位于窗口最上方。
    • 运行/停止按钮: 左侧的三角形按钮用于编译和运行你的 App,方形按钮用于停止运行。
    • 设备/模拟器选择: 旁边可以选择你要运行 App 的目标设备(连接的真机或各种模拟器,如 iPhone 15 Pro, iPad Air 等)。
    • 活动指示器: 显示当前 Xcode 正在进行的操作,如编译、索引等。
    • 视图切换按钮: 右侧有三个按钮,可以控制显示或隐藏左侧的导航器区域、底部的调试区域和右侧的检查器区域。这对于调整工作区大小非常有用。
    • 代码库/对象库 (+ 按钮): 用于添加代码片段、UI 元素等。
  2. 导航器区域 (Navigator Area):

    • 位于窗口左侧。可以通过顶部的标签栏切换不同的导航器。最常用的有:
      • 项目导航器 (Project Navigator - 文件夹图标): 这是最常用的导航器,显示项目的所有文件和文件夹结构。你可以在这里选择要编辑的文件。
      • 符号导航器 (Symbol Navigator): 显示项目中的类、结构体、协议、方法等符号层级。
      • 搜索导航器 (Find Navigator - 放大镜图标): 进行项目范围内的文本搜索和替换。
      • 问题导航器 (Issue Navigator - 感叹号三角图标): 显示编译时的错误 (Errors) 和警告 (Warnings)。这是排查问题的重要地方。
      • 调试导航器 (Debug Navigator - 虫子图标): 在程序运行时显示当前的线程和调用栈信息。
      • 断点导航器 (Breakpoint Navigator): 管理你设置的所有断点。
      • 报告导航器 (Report Navigator): 查看构建、运行和调试的历史日志。
  3. 编辑器区域 (Editor Area):

    • 位于窗口中央,是你花费时间最多的地方。
    • 代码编辑: 当你选择一个 Swift 文件时,这里就是代码编辑器,提供语法高亮、自动补全、错误提示等功能。
    • Interface Builder: 当你选择一个 Storyboard (.storyboard) 或 XIB (.xib) 文件时,这里会变成可视化的界面设计器。你可以拖拽 UI 控件、设置布局约束。
    • 其他编辑器: 对于图片、配置文件 (Info.plist) 等,也会有相应的可视化编辑器。
    • Assistant Editor: Xcode 可以将编辑器区域一分为二,同时显示两个相关的文件。例如,在编辑 Storyboard 时,可以打开对应的 ViewController.swift 文件,方便连接 UI 元素和代码。可以通过工具栏右上角的“Add Editor on Right”或“Assistant”按钮来打开。
  4. 检查器区域 (Inspector Area):

    • 位于窗口右侧。可以通过顶部的标签栏切换不同的检查器。它的内容会根据你在编辑器或导航器中选中的内容动态变化。
      • 文件检查器 (File Inspector): 显示选中文件的基本信息、路径、本地化设置等。
      • 历史检查器 (History Inspector): 显示选中文件的版本控制历史(如果你使用了 Git)。
      • 快速帮助检查器 (Quick Help Inspector - 问号图标): 显示选中代码(如类、方法、属性)的文档和说明。非常有用!
      • (当选中 UI 元素或代码符号时出现)
        • 身份检查器 (Identity Inspector): 设置 UI 元素的类、唯一标识符 (Storyboard ID) 等。
        • 属性检查器 (Attributes Inspector - 滑块图标): 这是最常用的检查器之一。用于配置选中项的各种属性。例如,对于一个按钮,可以设置标题、字体、颜色、背景图等;对于一个类,可以设置其访问控制级别等。
        • 尺寸检查器 (Size Inspector - 尺子图标): 用于设置 UI 元素的大小和位置(在使用 Frame 布局或查看约束时)。
        • 连接检查器 (Connections Inspector - 圆圈箭头图标): 用于管理 UI 元素与代码之间的连接(@IBOutlet, @IBAction)。
  5. 调试区域 (Debug Area):

    • 位于窗口底部,默认可能隐藏。可以通过工具栏右下角的按钮或快捷键 (Shift + Command + Y) 来显示/隐藏。
      • 变量视图 (Variables View): 当程序运行到断点处暂停时,这里会显示当前作用域内的变量及其值。
      • 控制台 (Console): 显示程序的输出(例如 print 语句打印的内容)以及系统日志、运行时错误信息等。你也可以在这里输入 LLDB 调试命令。

初看起来,这些区域和功能可能有点多,但别担心,你不需要一次性全部掌握。随着你开始编写代码和构建应用,你会逐渐熟悉这些区域的作用,并发现它们是如何协同工作的。现在,你只需要对 Xcode 的基本布局有一个大致的印象即可。

三、Swift 语言快速入门:掌握核心语法

Swift 是我们用来和计算机沟通,告诉它如何构建和运行 iOS 应用的语言。它是一种强大且现代的语言,但入门并不难。在这个快速入门部分,我们只关注那些最核心、构建第一个应用马上就能用到的基础知识。

我们不会深入探讨所有细节,目标是让你能读懂并写出简单的 Swift 代码。

1. 变量 (Variables) 与 常量 (Constants)

在编程中,我们经常需要存储信息,比如用户的名字、按钮被点击的次数、或者一个计算结果。这些信息需要放在内存中的某个位置,并给这个位置起个名字,方便以后访问和修改。这个“带名字的存储位置”就是变量常量

  • 常量 (Constant): 使用 let 关键字声明。一旦你给常量赋了一个值,这个值就不能再改变了。就像你的出生日期,一旦确定,就不会变了。常量是 Swift 中推荐优先使用的,因为它们更安全,能帮助编译器优化代码。

    let maximumLoginAttempts = 10 // 最大登录尝试次数,通常是固定的
    let welcomeMessage = "你好,欢迎使用我们的 App!" // 欢迎语,设定后不变
    let pi = 3.14159 // 圆周率,是个恒定值
    
  • 变量 (Variable): 使用 var 关键字声明。变量的值在声明之后可以被修改。就像游戏中的得分,会随着游戏进程而变化。

    var currentScore = 0 // 当前得分,初始为 0
    currentScore = 100 // 得分变为 100
    currentScore = currentScore + 20 // 在现有基础上增加 20 分
    
    var userName = "访客" // 用户名,初始为访客
    userName = "张三" // 用户登录后,用户名变为张三
    

如何选择 let 还是 var
很简单:如果你确定一个值在设定后不需要再改变,就用 let。如果你预计这个值将来可能会变,就用 var。优先考虑使用 let。如果用了 let 之后发现确实需要改变它,Xcode 会提示你改成 var

2. 基本数据类型

我们存储的信息有不同的种类,比如数字、文字、对错判断等。Swift 需要知道你存储的是哪种类型的数据,以便正确地处理它们。这就是数据类型。以下是几种最常用的基本数据类型:

  • Int (Integer): 整数类型

    • 用来表示没有小数部分的数字,比如 -1, 0, 100, 999。
    • 例子:let age = 30, var numberOfWheels = 4
  • DoubleFloat: 浮点数类型

    • 用来表示带有小数部分的数字,比如 3.14, -0.5, 100.0。
    • Double 精度更高(大约 15 位小数),通常是推荐使用的浮点类型。
    • Float 精度较低(大约 6 位小数),在特定场景下(如图形处理或内存敏感时)可能会用到。
    • 例子:let averageScore = 88.5, var price = 99.99
    • 注意: Swift 对类型要求严格,IntDouble 不能直接混合运算。你需要显式转换:
      let integerValue = 10
      let doubleValue = 5.5
      let result = Double(integerValue) + doubleValue // 需要把 Int 转成 Double
      print(result) // 输出: 15.5
      
  • String: 字符串类型

    • 用来表示一串文本,比如 “Hello”, “你好,世界”, “用户123”。字符串需要用双引号 " 包裹起来。
    • 例子:let message = "操作成功!", var email = "example@example.com"
    • 字符串插值 (String Interpolation): 可以方便地将变量或常量的值嵌入到字符串中,使用 \() 语法。
      var score = 85
      let playerName = "小明"
      let report = "\(playerName) 的得分是 \(score) 分。" // report 的值是 "小明 的得分是 85 分。"
      print(report)
      score = 90
      let updatedReport = "\(playerName) 的最新得分是 \(score) 分。" // updatedReport 的值是 "小明 的最新得分是 90 分。"
      print(updatedReport)
      
  • Bool (Boolean): 布尔类型

    • 只有两个可能的值:true (真) 和 false (假)。
    • 通常用于表示条件判断的结果,比如开关的状态、操作是否成功等。
    • 例子:let isUserLoggedIn = false, var hasAcceptedTerms = true

Swift 是一种类型安全 (Type-Safe) 的语言。这意味着编译器会在编译时检查你的代码,确保你不会把错误类型的值赋给变量(比如把 “Hello” 赋给一个 Int 类型的变量)。这有助于在早期发现错误。

通常,你不需要显式地写出类型,Swift 可以根据你赋的初始值推断 (Type Inference) 出变量或常量的类型:

let myName = "Alice" // Swift 推断 myName 是 String 类型
var myAge = 25       // Swift 推断 myAge 是 Int 类型
let piValue = 3.14   // Swift 推断 piValue 是 Double 类型
let isReady = true   // Swift 推断 isReady 是 Bool 类型

当然,你也可以显式指定类型,使用冒号 :

let explicitDouble: Double = 70 // 显式指定为 Double,即使初始值是整数
var currentStatus: String      // 先声明类型,稍后再赋值
currentStatus = "处理中..."

3. 基础控制流

程序很少是完全从上到下顺序执行的。我们经常需要根据不同的条件执行不同的代码,或者重复执行某段代码。这就是控制流

  • if / else if / else 语句:条件判断

    • 用于根据一个布尔值 (truefalse) 的条件来决定执行哪段代码。
    • if 块:当条件为 true 时执行。
    • else if 块(可选):当前面的 if 条件为 false 时,检查这个条件。可以有多个 else if
    • else 块(可选):当所有前面的 ifelse if 条件都为 false 时执行。
    let temperature = 25
    
    if temperature < 10 {
        print("天气寒冷,请多穿衣服。")
    } else if temperature < 20 {
        print("天气凉爽,体感舒适。")
    } else if temperature < 30 {
        print("天气温暖。")
    } else {
        print("天气炎热,注意防暑。")
    }
    // 输出: 天气温暖。
    
    let isLoggedIn = false
    if isLoggedIn {
        print("欢迎回来!")
    } else {
        print("请先登录。")
    }
    // 输出: 请先登录。
    
    • 条件必须是一个明确的布尔表达式,例如比较 (<, >, ==, !=, <=, >=) 或一个布尔变量。
  • for-in 循环:遍历序列

    • 用于重复执行一段代码,通常是遍历一个序列 (Sequence) 中的每一个元素。序列可以是数字范围、数组、字典等。

    • 遍历数字范围: 使用 ... (闭区间,包含结束值) 或 ..< (半开区间,不包含结束值)。

      // 打印数字 1 到 5
      print("打印 1 到 5:")
      for i in 1...5 {
          print(i) // 会依次打印 1, 2, 3, 4, 5
      }
      
      // 打印 0 到 3
      print("打印 0 到 3:")
      for number in 0..<4 {
          print("数字是 \(number)") // 会依次打印 "数字是 0", "数字是 1", "数字是 2", "数字是 3"
      }
      
    • 遍历数组 (Array): 数组是存储同类型元素的有序集合,我们会在下一篇详细介绍。这里先看个例子。

      let names = ["张三", "李四", "王五"] // 这是一个字符串数组
      print("打招呼:")
      for name in names {
          print("你好, \(name)!") // 会依次打印 "你好, 张三!", "你好, 李四!", "你好, 王五!"
      }
      
    • 如果你在循环中不需要用到当前元素的值,可以用下划线 _ 来忽略它:

      // 重复执行某个操作 3 次
      print("重复操作:")
      for _ in 1...3 {
          print("执行一次任务...")
      }
      

if/elsefor-in 是构建程序逻辑的基础,能够让你根据条件做出反应并处理重复性任务。

4. 函数基础

当你发现自己需要反复写同样或类似的代码块时,或者想把一段具有特定功能的代码组织起来并给它一个名字时,就应该使用函数 (Function)

函数是一段封装好的、用来执行特定任务的代码块。你可以给它起一个名字,然后在需要执行这个任务的任何地方,通过调用这个名字来执行它。

  • 定义函数: 使用 func 关键字,后面跟函数名、圆括号 ()(可能包含参数),以及可选的返回类型箭头 -> ReturnType,最后是大括号 {} 包裹的函数体代码。

    // 一个简单的打招呼函数,没有参数,也没有返回值
    func greet() {
        print("大家好!")
    }
    
    // 一个接受名字参数的打招呼函数
    func greet(personName: String) {
        print("你好, \(personName)!")
    }
    
    // 一个计算两个整数之和的函数,接受两个 Int 参数,返回一个 Int 结果
    func addTwoInts(a: Int, b: Int) -> Int {
        let sum = a + b
        return sum // 使用 return 关键字返回结果
    }
    
  • 调用函数: 使用函数名加上圆括号 () 来调用函数。如果函数需要参数,在圆括号里传入对应的值。

    greet() // 调用第一个函数,输出: 大家好!
    
    greet(personName: "王小明") // 调用第二个函数,输出: 你好, 王小明!
    
    let result = addTwoInts(a: 5, b: 3) // 调用第三个函数,并将返回值赋给常量 result
    print("5 + 3 = \(result)") // 输出: 5 + 3 = 8
    
    • 注意调用带参数的函数时,通常需要写上参数标签 (Argument Label),比如 personName:a:, b:。这让代码更易读。

函数的好处:

  • 代码复用: 避免重复编写相同的代码。
  • 代码组织: 将代码分解成逻辑单元,使程序结构更清晰。
  • 可读性: 有意义的函数名能让代码更容易理解。
  • 可维护性: 修改功能时,只需要修改对应的函数内部即可。

5. (可选) 类 (Class) 与 结构体 (Struct) 的简单介绍

在 Swift 中,类和结构体是创建自定义数据类型的两种主要方式,它们是构建更复杂程序的基石。你可以把它们想象成蓝图 (Blueprint),用来定义某种事物(对象)应该具有的属性 (Properties)(存储的数据,类似变量或常量)和方法 (Methods)(能执行的操作,类似函数)。

  • 结构体 (Struct): 使用 struct 关键字定义。通常用于封装少量相关的数据。结构体是值类型 (Value Type)。这意味着当你把一个结构体实例赋给一个新的变量或常量,或者把它传递给函数时,实际上是复制了一份。修改副本不会影响原始的实例。就像复印一份文件,修改复印件不会改变原件。

    struct Resolution {
        var width = 0 // 属性:宽度
        var height = 0 // 属性:高度
    
        // 方法:计算像素总数
        func pixels() -> Int {
            return width * height
        }
    }
    
    // 使用蓝图创建实例 (对象)
    var screenResolution = Resolution(width: 1920, height: 1080)
    
    // 访问属性
    print("屏幕宽度: \(screenResolution.width)") // 输出: 屏幕宽度: 1920
    
    // 调用方法
    print("总像素: \(screenResolution.pixels())") // 输出: 总像素: 2073600
    
    // 复制一份
    var cinemaResolution = screenResolution
    cinemaResolution.width = 2048 // 修改副本
    
    print("屏幕宽度仍然是: \(screenResolution.width)") // 输出: 屏幕宽度仍然是: 1920 (原始实例未受影响)
    print("影院宽度是: \(cinemaResolution.width)")   // 输出: 影院宽度是: 2048
    
  • 类 (Class): 使用 class 关键字定义。通常用于表示更复杂的对象,或者需要继承(一个类可以基于另一个类构建)和引用语义的场景。类是引用类型 (Reference Type)。这意味着当你把一个类实例赋给一个新的变量或常量,或者传递给函数时,传递的是对同一个内存地址的引用。多个变量/常量可以指向同一个实例,修改任何一个引用指向的实例,都会影响到所有指向该实例的引用。就像多人共享编辑同一份在线文档,任何人的修改都会被所有人看到。

    class VideoMode {
        var resolution = Resolution() // 可以包含其他结构体或类的实例
        var frameRate = 0.0
        var name: String? // ? 表示这是一个可选类型,可能没有值 (nil)
    
        // 初始化器 (Initializer),用于创建实例时设置初始状态
        init(name: String, resolution: Resolution, frameRate: Double) {
            self.name = name
            self.resolution = resolution
            self.frameRate = frameRate
        }
    
        func description() -> String {
            return "\(name ?? "Unknown"): \(resolution.width)x\(resolution.height) @ \(frameRate)fps"
        }
    }
    
    // 创建实例
    let hd = Resolution(width: 1920, height: 1080)
    let fullHD = VideoMode(name: "Full HD", resolution: hd, frameRate: 60.0)
    
    // 访问属性和调用方法
    print(fullHD.description()) // 输出: Full HD: 1920x1080 @ 60.0fps
    
    // 创建另一个引用指向同一个实例
    let alsoFullHD = fullHD
    alsoFullHD.frameRate = 30.0 // 通过 alsoFullHD 修改
    
    // 原始引用 fullHD 也受到了影响
    print(fullHD.description()) // 输出: Full HD: 1920x1080 @ 30.0fps
    

简单总结:

  • struct 是值类型(复制),class 是引用类型(共享)。
  • 它们都可以定义属性来存储值,定义方法来提供功能。
  • 初学阶段,你会更多地用到系统提供的类和结构体,以及编写简单的函数。随着学习深入,你会开始创建自己的 structclass 来组织代码。

至此,你已经掌握了编写第一个简单 iOS 应用所需的最核心的 Swift 语法。这些知识点(let/var、基本类型、if/elsefor-infunc、以及对 struct/class 的初步了解)将是你 आगे बढ़ने 的基础。

四、创建你的第一个项目:Xcode 项目初体验

理论学习告一段落,现在是时候动手实践了!我们将使用 Xcode 创建我们的第一个 iOS 应用程序项目。

  1. 启动 Xcode: 打开你安装好的 Xcode。

  2. 创建新项目: 在 Xcode 的欢迎窗口中,选择 “Create a new Xcode project”。如果欢迎窗口没有出现,你可以通过菜单栏选择 File > New > Project...

  3. 选择模板: Xcode 提供了多种项目模板来帮助你快速开始。在弹出的窗口中,确保顶部的标签页选中 “iOS”。然后在 “Application” 分类下,选择 “App” 模板。这个模板为创建一个标准的 iOS 应用提供了基础结构。点击 “Next”。

  4. 填写项目选项: 接下来,你需要填写一些关于项目的信息:

    • Product Name: 给你的应用起个名字,比如 “MyFirstApp” 或者 “CounterApp”。这个名字会显示在设备的主屏幕上。
    • Team: 如果你登录了 Apple ID 并且加入了开发者计划(或者只是用免费账号),这里可以选择你的个人团队。如果没登录或者不想选,可以选择 “None”。对于在模拟器上运行,选 “None” 也没问题。
    • Organization Identifier: 这通常是你或你公司的反向域名,比如 com.yourcompanycom.yourname。它用来和 Product Name 一起构成应用的唯一标识符 (Bundle Identifier),例如 com.yourname.MyFirstApp。如果你没有域名,可以暂时编一个,比如 com.example。这个标识符在发布到 App Store 时必须是唯一的。
    • Bundle Identifier: 这个通常由 Organization Identifier 和 Product Name 自动生成,一般不需要修改。
    • Interface: 这里是关键选择!它决定了你将使用哪种方式来构建用户界面:
      • Storyboard: 选择这个会使用 UIKit 框架和可视化的 Storyboard 文件来设计界面。这是传统的、成熟的方式。
      • SwiftUI: 选择这个会使用现代的 SwiftUI 框架,通过声明式的 Swift 代码来构建界面。
      • 我们选哪个? 为了让初学者体验更直观的拖拽式开发,我们这次先选择 Storyboard。在后续的构建环节,我们会简单对比一下 SwiftUI 的写法。
    • Language: 确保选择 Swift
    • Use Core Data: 这个选项用于集成苹果的数据持久化框架。我们暂时用不到,取消勾选
    • Include Tests: 这会为你的项目添加单元测试 (Unit Tests) 和 UI 测试 (UI Tests) 的目标。对于初学,可以取消勾选以简化项目结构,当然保留也无妨。
    • 填好后,点击 “Next”。
  5. 选择保存位置: Xcode 会让你选择项目的保存位置。选择一个你容易找到的文件夹(比如桌面或一个专门的项目文件夹),然后点击 “Create”。

Xcode 现在会创建好项目并打开主窗口,展示你刚刚配置好的项目结构。恭喜你,你的第一个 iOS 项目已经成功创建!

项目文件结构概览

项目创建完成后,花点时间看看左侧的项目导航器 (Project Navigator)。你会看到 Xcode 自动生成了一些文件和文件夹。对于我们刚刚选择的 Storyboard 接口项目,主要关注以下几个文件/组:

  • MyFirstApp (你的项目名称) 文件夹:

    • AppDelegate.swift: 这个文件包含了应用程序代理 (App Delegate) 的代码。它负责处理应用程序生命周期事件(比如启动、进入后台、终止等)和一些全局的设置。对于简单的应用,你可能不需要经常修改它。
    • SceneDelegate.swift: 对于支持多窗口的应用(主要在 iPadOS 上,或者 iOS 13 及以后版本),这个文件负责管理应用窗口(场景,Scene)的生命周期(比如场景创建、连接、断开、进入前台、进入后台等)。它与 AppDelegate 协同工作。
    • ViewController.swift: 这是与我们主界面相关联的视图控制器 (View Controller) 文件。视图控制器是 iOS (UIKit) 开发中的核心概念,它负责管理一个特定的视图(View)及其子视图,并处理用户的交互逻辑。我们的界面元素(按钮、标签)和响应代码将主要放在这里。
    • Main.storyboard: 这是可视化的界面设计文件。双击它,Xcode 的中央编辑器区域会变成 Interface Builder。你可以在这里拖拽 UI 控件、布局界面、设置控件属性,并将 UI 元素连接到 ViewController.swift 代码中。
    • Assets.xcassets: 这是资源目录,用来管理应用中使用的图片、图标、颜色等资源。你可以把不同分辨率的图片拖到这里,系统会根据设备自动选择合适的版本。App 的图标也在这里设置。
    • LaunchScreen.storyboard: 这个 Storyboard 文件定义了应用启动时短暂显示的启动画面。通常只包含一个简单的 Logo 或背景。
    • Info.plist: 这是项目的信息属性列表文件。它是一个 XML 文件(Xcode 提供了友好的编辑器),包含了应用的各种配置信息,比如 Bundle Identifier、版本号、设备朝向支持、权限请求说明等。
  • Products 文件夹: 这里包含了编译成功后生成的最终应用文件 (.app)。你通常不需要直接操作这里的文件。

不同的项目模板和设置(比如选择 SwiftUI 接口)会生成略有不同的文件结构。例如,如果选择 SwiftUI,就不会有 ViewController.swiftMain.storyboard,取而代之的会是类似 ContentView.swift 这样的 SwiftUI 视图文件。

现在,你对一个基本的 iOS 项目包含哪些部分有了初步的了解。接下来,我们将聚焦于 Main.storyboardViewController.swift,开始构建我们的第一个交互式界面。

五、构建 “Hello, World!” 或简单计数器 App

是时候让我们的应用做点实际的事情了!我们将创建一个非常简单的应用:界面上有一个标签 (Label) 显示文本,一个按钮 (Button)。点击按钮后,标签的文本会改变。我们会分别展示使用 UIKit (Storyboard)SwiftUI 的实现思路,但主要动手实践以我们刚才创建的 Storyboard 项目为准。

实现思路 (对比)

  • UIKit (Storyboard) 方式:

    1. 视觉设计 (Storyboard): 打开 Main.storyboard,从对象库 (Object Library) 拖拽一个 UILabel 和一个 UIButton 到视图控制器的主视图 (View) 上。调整它们的位置和外观(比如按钮文字)。
    2. 建立连接 (Outlet & Action): 打开 ViewController.swift 文件和 Main.storyboard 文件(可以使用 Assistant Editor 并排显示)。
      • 按住 Control 键,从 Storyboard 上的 UILabel 拖拽到 ViewController.swift 代码中,创建一个 @IBOutlet 连接。这让代码可以引用这个标签,以便修改它的文本。
      • 按住 Control 键,从 Storyboard 上的 UIButton 拖拽到 ViewController.swift 代码中,创建一个 @IBAction 连接。这会在按钮被点击时触发一段特定的代码。
    3. 编写逻辑 (Swift):@IBAction 方法内部,编写 Swift 代码来修改 @IBOutlet 连接的标签的 text 属性。
  • SwiftUI 方式:

    1. 声明界面 (Swift 代码): 打开 ContentView.swift (或其他 SwiftUI 视图文件)。
    2. 定义状态: 使用 @State 属性包装器声明一个变量来存储需要在界面上显示和修改的数据(比如标签的文本或计数值)。
    3. 构建视图层级:body 计算属性中,使用 VStack (垂直堆叠) 或其他布局容器来组织 Text (相当于 UILabel) 和 Button 视图。
    4. 绑定数据与行为:Text 视图的显示内容绑定到 @State 变量。在 Buttonaction 闭包中,编写代码来修改 @State 变量的值。SwiftUI 会自动检测到状态变化并更新界面。

现在,我们来动手实践 UIKit (Storyboard) 的方式。

动手实践:使用 UIKit (Storyboard) 构建计数器

我们将做一个简单的计数器:一个标签显示数字 0,一个按钮标题为“点我+1”。每次点击按钮,标签显示的数字加 1。

  1. 打开 Storyboard: 在项目导航器中,点击 Main.storyboard 文件。中央编辑器会显示 Interface Builder。你应该能看到一个代表 ViewController 场景的白色矩形区域。

  2. 添加 UI 元素:

    • 找到对象库 (Object Library): 如果你看不到对象库,可以通过菜单栏 View > Show Library 或点击 Xcode 工具栏右上角的 + 按钮来打开。
    • 拖拽 UILabel: 在对象库的搜索框中输入 “Label”。找到 UILabel,把它拖拽到 ViewController 的视图中央靠上的位置。
    • 拖拽 UIButton: 再次打开对象库,搜索 “Button”。找到 UIButton,把它拖拽到 UILabel 下方。
    • 修改属性 (Attributes Inspector):
      • 选中刚刚拖入的 UILabel。在右侧的检查器区域,选择属性检查器 (Attributes Inspector - 图标像个滑块)
      • 在 “Text” 字段中,将默认的 “Label” 改为 “0”。
      • 可以调整一下字体大小 (Font),比如设置为 “System 24.0” 或更大,让它显眼一点。
      • 可以设置对齐方式 (Alignment) 为居中。
      • 选中 UIButton。在属性检查器中,将 “Title” 字段的 “Button” 改为 “点我+1”。同样可以调整字体。
  3. 设置布局 (Auto Layout - 基础): 为了让控件在不同尺寸的屏幕上位置相对稳定,我们需要添加约束 (Constraints)。对于初学者,我们用最简单的方式:

    • 选中 UILabel。点击 Interface Builder 编辑器右下角的一排小图标中的第二个(像一个领结或对齐图标 - Align)。勾选 “Horizontally in Container”,然后点击 “Add 1 Constraint”。这会让标签水平居中。
    • 再次选中 UILabel。点击 Interface Builder 编辑器右下角的一排小图标中的第三个(像一个 TIE 战斗机或添加新约束图标 - Add New Constraints)。在上方输入一个距离顶部安全区域的距离,比如 “50”。点击红色的横线激活约束,然后点击 “Add 1 Constraint”。
    • 选中 UIButton。同样使用 “Align” 菜单,勾选 “Horizontally in Container”,添加约束。
    • 再次选中 UIButton。使用 “Add New Constraints” 菜单,在上方输入一个距离上方 UILabel 的距离,比如 “30”。点击连接上方的红色竖线激活约束,然后点击 “Add 1 Constraint”。
    • 如果 Xcode 在左侧文档大纲视图或画布上显示红色或黄色箭头/警告,可以尝试选中 ViewController,然后点击 Interface Builder 右下角的第四个图标 (Resolve Auto Layout Issues),选择 “Update Frames” 或在特定视图上选择 “Fix Misplacement”。Auto Layout 是一个需要深入学习的主题,这里我们只做最基础的设置。
  4. 连接 UI 到代码: 现在我们需要把 Storyboard 中的 UILabelUIButton 连接到 ViewController.swift 文件中。

    • 打开 Assistant Editor: 确保 Main.storyboard 是当前活动的编辑器。点击 Xcode 工具栏右上角的 “Assistant” 按钮(两个重叠的圆圈图标)。Xcode 会尝试自动在右侧打开对应的 Swift 文件,通常就是 ViewController.swift。如果不是,可以在右侧编辑器的顶部导航条手动选择它。
    • 创建 Outlet (连接标签):
      • 按住键盘上的 Control 键。
      • 鼠标左键点击 Storyboard 中的 UILabel (显示 “0” 的那个)。
      • 按住 Control 键和鼠标左键不放,将鼠标拖拽到右侧 ViewController.swift 代码中 class ViewController: UIViewController { 这一行的下方、viewDidLoad() 函数的上方空白处。
      • 松开鼠标和 Control 键,会弹出一个小窗口。
      • Connection: 确保是 “Outlet”。
      • Name: 给这个连接起个名字,用来在代码中引用这个标签。输入 countLabel (遵循小驼峰命名法)。
      • Type: 应该是 UILabel
      • Storage: 通常是 Weak,暂时不用深究。
      • 点击 “Connect”。
      • 你会看到代码中多了一行: @IBOutlet weak var countLabel: UILabel! 这就是我们创建的 Outlet。感叹号表示这是一个隐式解包可选类型,我们暂时可以认为它一定会有值(因为是从 Storyboard 连接过来的)。
    • 创建 Action (连接按钮点击事件):
      • 按住键盘上的 Control 键。
      • 鼠标左键点击 Storyboard 中的 UIButton (显示 “点我+1” 的那个)。
      • 按住 Control 键和鼠标左键不放,将鼠标拖拽到右侧 ViewController.swift 代码中 viewDidLoad() 函数的下方空白处。
      • 松开鼠标和 Control 键,弹出窗口。
      • Connection: 这次要选择 “Action”
      • Name: 给这个动作起个名字,表示按钮被点击时要执行的操作。输入 incrementButtonTapped
      • Type: 通常选择 UIButton,这样可以访问到是哪个按钮触发了事件(虽然我们只有一个按钮)。也可以选择 Any
      • Event: 确保是 “Touch Up Inside”。这是最常用的按钮点击事件,表示用户手指在按钮范围内按下并抬起。
      • Arguments: 通常选择 “Sender”。
      • 点击 “Connect”。
      • 你会看到代码中多了一个方法(函数):
        @IBAction func incrementButtonTapped(_ sender: UIButton) {
            // 按钮被点击时,这里的代码会执行
        }
        
  5. 编写逻辑代码: 现在万事俱备,只欠东风——编写按钮被点击时更新标签的逻辑。

    • 首先,我们需要一个变量来存储当前的计数值。在 ViewController 类中,@IBOutlet 的下方,添加一个变量:
      class ViewController: UIViewController {
      
          @IBOutlet weak var countLabel: UILabel!
          var currentCount = 0 // 添加一个变量来存储计数值,初始为 0
      
          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view.
          }
      
          @IBAction func incrementButtonTapped(_ sender: UIButton) {
              // 按钮被点击时,这里的代码会执行
          }
      }
      
    • 然后,在 incrementButtonTapped 方法内部,添加以下代码:
      @IBAction func incrementButtonTapped(_ sender: UIButton) {
          // 1. 将计数值加 1
          currentCount = currentCount + 1
      
          // 2. 更新标签显示的文本
          //    需要将 Int 类型的 currentCount 转换为 String 类型才能赋给 label 的 text 属性
          countLabel.text = String(currentCount)
      }
      
      • 我们首先将 currentCount 加 1。
      • 然后,我们通过 countLabel 这个 Outlet 访问到界面上的标签,并设置它的 text 属性。因为 text 属性需要一个 String 类型的值,而 currentCountInt 类型,所以我们使用 String(currentCount) 将数字转换为字符串。

完整的 ViewController.swift 代码现在看起来像这样:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var countLabel: UILabel!
    var currentCount = 0 // 添加一个变量来存储计数值,初始为 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // 视图加载完成后执行一次的设置代码可以放在这里
        // 比如,确保初始时标签显示的是 currentCount 的值
        countLabel.text = String(currentCount)
    }

    @IBAction func incrementButtonTapped(_ sender: UIButton) {
        // 1. 将计数值加 1
        currentCount = currentCount + 1
        // currentCount += 1 // 这是更简洁的写法

        // 2. 更新标签显示的文本
        countLabel.text = String(currentCount)
    }
}

我们还在 viewDidLoad() 方法中加了一行代码 countLabel.text = String(currentCount),这是一个好习惯,确保视图加载完成时,标签显示的是我们 currentCount 变量的初始值(虽然我们已经在 Storyboard 设置了初始文本为 “0”,但保持代码和状态一致性更好)。viewDidLoad() 是视图控制器生命周期中的一个方法,在视图从 Storyboard 加载完毕后会被调用一次,通常用于进行一些初始设置。

到这里,我们的计数器应用的核心逻辑就完成了!

六、运行与调试:看到你的成果

激动人心的时刻到了!我们要运行刚刚创建的应用,看看它是否能正常工作,并学习一点基础的调试技巧。

1. 在模拟器上运行

Xcode 自带了各种 iPhone 和 iPad 的模拟器 (Simulator),让你可以在 Mac 上模拟真实设备的运行环境,方便测试。

  1. 选择模拟器: 在 Xcode 工具栏的左上角,找到运行按钮(三角形)旁边的设备选择菜单。点击它,会列出你连接的真机(如果有)和一系列可用的模拟器。选择一个你喜欢的 iPhone 模拟器,比如 “iPhone 15 Pro” 或 “iPhone SE (3rd generation)”。
  2. 点击运行: 点击工具栏左上角的运行按钮 (▶),或者使用快捷键 Command + R
  3. 等待编译和启动: Xcode 会开始编译你的代码。你可以在工具栏顶部的活动指示器看到进度(比如 “Building MyFirstApp…”)。编译成功后,Xcode 会自动启动你选择的模拟器(如果尚未运行),并将你的应用安装到模拟器上并启动它。这个过程第一次可能会稍慢一些。
  4. 交互: 模拟器启动并显示你的应用后,你就可以像在真实手机上一样操作它了!点击 “点我+1” 按钮,看看标签上的数字是不是从 0 开始,每次点击都增加 1?

如果一切顺利,恭喜你!你已经成功运行了你的第一个自己编写的 iOS 应用!

2. 基础调试技巧

程序很少一次就能完美运行,调试是开发过程中必不可少的一环。Xcode 提供了强大的调试工具,我们先了解两个最基础的:

  • 使用 print 语句:

    • 这是最简单直接的调试方式。你可以在代码的任何地方插入 print() 语句来输出变量的值、检查代码是否执行到了某个位置等。
    • 例如,我们可以在 incrementButtonTapped 方法里加一句 print
      @IBAction func incrementButtonTapped(_ sender: UIButton) {
          currentCount += 1
          countLabel.text = String(currentCount)
          print("按钮被点击了!当前计数值是: \(currentCount)") // 添加 print 语句
      }
      
    • 再次运行应用 (Command + R)。每次点击按钮,除了界面上的数字变化,你还会看到 Xcode 底部调试区域控制台 (Console) 输出了类似 “按钮被点击了!当前计数值是: 1” 这样的信息。如果控制台没有显示,可以通过工具栏右下角的按钮或快捷键 Shift + Command + Y 打开。
    • print 对于快速检查程序流程和变量状态非常有用。
  • 设置断点 (Breakpoint):

    • 断点允许你在代码的特定行暂停程序的执行,然后可以检查当前所有变量的值、单步执行代码等。
    • 设置断点: 在 Xcode 编辑器中,找到你想要暂停的那一行代码(比如 currentCount += 1 这一行)。在行号旁边灰色的区域(称为 “gutter”)点击一下,会出现一个蓝色的箭头标记,这就是断点。
    • 运行到断点: 再次运行应用 (Command + R)。当你点击按钮时,程序的执行会在这行代码之前暂停,Xcode 会高亮显示这一行,并且底部的调试区域会激活。
    • 检查变量: 在调试区域的左侧变量视图 (Variables View) 中,你可以看到当前作用域内的所有变量(比如 self, sender, currentCount)以及它们的值。此时 currentCount 应该还是加 1 之前的值。
    • 控制执行流程: 调试区域上方有一排控制按钮:
      • Continue (继续): (形状像播放按钮) 让程序继续运行,直到遇到下一个断点或程序结束。
      • Step Over (单步跳过): (向下弯的箭头) 执行当前行代码,如果当前行是函数调用,它会执行完整个函数然后停在下一行,不会进入函数内部。
      • Step Into (单步进入): (向下的箭头) 如果当前行是一个函数调用,它会进入该函数内部的第一行暂停。如果不是函数调用,则行为类似 Step Over。
      • Step Out (单步跳出): (向上的箭头) 如果你已经 Step Into 进入了一个函数,这个按钮会执行完当前函数剩余的代码,然后停在调用该函数处的下一行。
    • 尝试: 点击几次 “Step Over” 按钮,观察 currentCount 的值如何在变量视图中变化,以及代码高亮如何移动。当你 Step Over countLabel.text = String(currentCount) 这一行后,再点击 “Continue”,你会看到模拟器界面上的数字更新了。
    • 移除断点: 再次点击蓝色的断点标记,或者将它拖拽出 gutter 区域,即可移除断点。

断点是更强大、更精确的调试工具,能够让你深入了解代码的执行细节。熟练使用断点和 print 是每个开发者必备的技能。

七、篇末总结:迈出第一步

恭喜你完成了这趟 iOS 开发的启程之旅!让我们回顾一下你在这篇文章中取得的成就:

  1. 理解了 iOS 开发: 你了解了什么是 iOS 开发,它为何吸引人,以及开始所需的准备(Mac 和 Xcode)。
  2. 熟悉了 Xcode: 你安装了核心开发工具 Xcode,并对其主要界面区域(导航器、编辑器、检查器、调试区)有了初步认识。
  3. 掌握了 Swift 基础: 你学习了 Swift 语言中最核心的元素:使用 letvar 定义常量和变量,认识了 Int, Double, String, Bool 等基本数据类型,学会了使用 if/else 进行条件判断和 for-in 进行循环,掌握了定义和调用 func 函数的基础,并对 classstruct 有了概念性的了解。
  4. 创建并理解了项目结构: 你使用 Xcode 的模板创建了你的第一个 iOS 项目,并了解了其中关键文件(如 AppDelegate, SceneDelegate, ViewController, Main.storyboard, Assets.xcassets, Info.plist)的作用。
  5. 构建了第一个交互应用: 你亲手使用 UIKit 和 Storyboard,通过拖拽 UI 元素、设置属性、建立 @IBOutlet@IBAction 连接,并编写 Swift 代码,实现了一个简单的计数器应用。
  6. 学会了运行和调试: 你成功地在 iOS 模拟器上运行了你的应用,并学会了使用 print 语句和设置断点来进行基础的调试。

虽然我们只构建了一个非常简单的应用,但这第一步至关重要。你已经跨过了最初的技术门槛,体验了从零到一的创造过程。编程和应用开发就是这样,通过不断学习新知识、动手实践、遇到问题、解决问题,一步步积累经验,最终构建出越来越复杂的系统。

接下来呢?

在下一篇文章 “第二篇:交互与界面 - 构建更丰富的用户体验” 中,我们将深入探索:

  • 更多 UIKit (或 SwiftUI) 的 UI 组件,如文本输入框 (UITextField)、图片视图 (UIImageView)、列表视图 (UITableView/List) 等。
  • 更复杂的界面布局和导航方式(如何在多个屏幕间跳转)。
  • 视图控制器 (UIViewController) 的生命周期。
  • 如何在不同界面之间传递数据。
  • 使用 UserDefaults 进行简单的数据持久化(让应用关闭后能记住一些信息)。

我们将通过构建一个稍微复杂一点的应用(比如一个简单的待办事项列表),来实践这些新的知识点。

现在,给自己一点鼓励!你已经迈出了坚实的第一步。保持这份好奇心和动手实践的热情,iOS 开发的广阔世界正等待你去探索。休息一下,消化今天学习的内容,我们下一篇再见!


Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐