Swift的学习笔记(一)

news2025/4/15 18:02:59

Swift的学习笔记(一)

文章目录

  • Swift的学习笔记(一)
    • 元组
      • 基本语法
      • 1. **创建元组**
      • 2. **访问元组的值**
      • 3. **命名的元组**
      • 4. **解构元组**
      • 5. **忽略某些值**
    • 可选值类型
      • 定义 Optional
      • Optional 的基本使用
        • 1. **给 Optional 赋值和取值**
        • 2. **强制解包(Force Unwrapping)**
      • if let语句的使用
    • 空合并运算符
      • **基本示例**
    • guard的使用
    • 循环的写法
      • Switch…case
        • 使用元组匹配
        • 条件匹配(`where`)
      • **数组的创建**
        • 方式 1:使用字面量
        • 方式 2:显式指定类型
        • 方式 3:空数组
        • 方式 4:创建具有默认值的数组
      • **数组的高级操作**
        • 1. **过滤(filter)**
        • 2. **映射(map)**
        • 3. **归约(reduce)**
        • 4. **排序(sorted 和 sort)**
    • 跳转语句
      • break跳出多重循环
        • **语法**:
        • 输出:

元组

元组(Tuple)是 Swift 中的一种强大的数据结构,用于将多个值组合成一个复合值。元组的内容可以是任意类型(不同类型的值可以组合在一起),并且每个值都可以有名称或只是位置。

基本语法

元组用圆括号 () 包裹值,多个值之间用逗号 , 分隔。

1. 创建元组

let person = ("John", 28)

上面的例子创建了一个元组,包含一个字符串 "John" 和一个整数 28

2. 访问元组的值

元组的值可以通过 位置索引名称 来访问:

let person = ("John", 28)

// 使用位置索引
print(person.0)  // 输出 "John"
print(person.1)  // 输出 28

3. 命名的元组

元组的元素可以有名称,这样更容易理解数据的意义:

let person = (name: "John", age: 28)

// 使用名称访问
print(person.name)  // 输出 "John"
print(person.age)   // 输出 28

4. 解构元组

元组可以通过解构直接将值赋给多个变量:

let person = ("John", 28)
let (name, age) = person

print(name)  // 输出 "John"
print(age)   // 输出 28

5. 忽略某些值

如果不需要某些值,可以使用 _ 忽略:

let person = ("John", 28)
let (name, _) = person

print(name)  // 输出 "John"

注:元组虽然用起来方便,但是只能用于简单的数据整合

可选值类型

在 Swift 中,Optional 是一种用来处理可能存在 “无值” 情况的类型,它是 Swift 安全性的一部分,帮助开发者避免运行时错误(如空指针异常)。

Optional 是一个枚举,表示两种可能性:

  1. 有值(some(Value))。
  2. 没有值(nil)。

定义 Optional

在类型后面加上一个问号(?)即可将该类型声明为 Optional:

var name: String? = nil

这意味着变量 name 可能有值,也可能是 nil

Optional 的基本使用

1. 给 Optional 赋值和取值
var name: String? = "Alice"  // 定义一个 Optional 类型的 String
print(name)  // 输出:Optional("Alice")
2. 强制解包(Force Unwrapping)

要从 Optional 中取出实际值,可以使用感叹号(!):

print(name!)  // 输出:Alice

⚠️ 注意: 如果 Optional 的值是 nil,强制解包会导致运行时崩溃。

if let语句的使用

if let 是 Swift 中一种常用于解包可选类型(Optional)的语法。它的作用是安全地尝试从一个可选值中提取出实际的值,如果该可选值不为 nil,则解包并将其赋值给一个新的常量或变量,供 if let 语句内部使用。若可选值为 nil,则 else 部分会被执行,或者你可以选择不执行任何操作。

var name: String? = "Alice"

// 使用 if let 解包
if let unwrappedName = name {
    print("Hello, \(unwrappedName)!")
} else {
    print("Name is nil.")
}

空合并运算符

它用于处理可选类型(Optional)中的 nil 值。该运算符的作用是:如果左边的可选值不为 nil,则返回它的值;如果左边的可选值为 nil,则返回右边的默认值。

基本示例

var name: String? = "Alice"
let unwrappedName = name ?? "Unknown"
print(unwrappedName)  // 输出:Alice

在上面的例子中,name 不为 nil,所以 unwrappedName 会被赋值为 name 的值 "Alice"

guard的使用

  • guard语句必须带有else语句,它的语法如下:
  • 当条件表达式为true时候跳过else语句中的内容,执行后面的语句组
  • 条件表达式为false时候执行else语句中的内容,跳转语句一般是return、break、continue或throw
guard 条件表达式 else {
    // 条换语句
    break
}

循环的写法

swift之中的循环和C语言的区别还是挺大的

for item in 0..<10 {
    print(item)
}

我们在swift之中一般只使用for—in循环

while count >= 20 {
    count += 1
    print(count)
}

关于while循环则是大差不差,另外需要提的一点是,count++这类操作在swift3已经被禁用了

至于C语言之中的do…while语句,则是用repeat…while代替

repeat {
    print("swift")
    count += 5
} while count < 30

Switch…case

使用元组匹配

switch 可以匹配元组,并结合模式匹配。

swift


复制代码
let point = (2, 3)

switch point {
case (0, 0):
    print("Origin")
case (_, 0):
    print("On the X-axis")
case (0, _):
    print("On the Y-axis")
case (-2...2, -2...2):
    print("Inside the box")
default:
    print("Outside the box")
}

输出

Inside the box

条件匹配(where

使用 wherecase 添加额外的条件:

let number = 15

switch number {
case let x where x % 2 == 0:
    print("\(x) is even")
case let x where x % 2 != 0:
    print("\(x) is odd")
default:
    print("Unknown")
}

输出

15 is odd

数组

数组的创建

方式 1:使用字面量
var numbers = [1, 2, 3, 4, 5]  // 自动推断类型为 [Int]
var fruits = ["Apple", "Banana", "Cherry"]  // 自动推断类型为 [String]
方式 2:显式指定类型
var numbers: [Int] = [1, 2, 3, 4, 5]
var fruits: [String] = ["Apple", "Banana", "Cherry"]
方式 3:空数组
var emptyArray: [Int] = []  // 明确指定类型
var anotherEmptyArray = [String]()  // 使用初始化器创建
方式 4:创建具有默认值的数组
var repeatedArray = Array(repeating: 0, count: 5)  // [0, 0, 0, 0, 0]

在 Swift 中,数组(Array) 是一种用于存储同一类型值的有序集合。数组是常用的数据结构,支持动态大小调整,能够快速地添加、删除和访问元素。

数组的高级操作

1. 过滤(filter)

从数组中筛选符合条件的元素:

let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)  // [2, 4]
2. 映射(map)

对数组的每个元素进行操作,生成新数组:

let numbers = [1, 2, 3]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers)  // [1, 4, 9]
3. 归约(reduce)

将数组的所有元素合并为一个值:

let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum)  // 10
4. 排序(sorted 和 sort)
  • 创建排序后的新数组:

    let numbers = [4, 2, 3, 1]
    let sortedNumbers = numbers.sorted()
    print(sortedNumbers)  // [1, 2, 3, 4]
    
  • 对原数组排序:

    var numbers = [4, 2, 3, 1]
    numbers.sort()
    print(numbers)  // [1, 2, 3, 4]
    

跳转语句

Swift 提供了多种流程跳转语句,用于改变代码的执行顺序,从而实现灵活的逻辑控制。这些语句包括 continuebreakfallthroughreturnthrowguard。它们有些和C语言很像,因此这里仅挑几个进行讲解

break跳出多重循环

Swift 允许为循环添加标记(label),通过 break 语句可以退出指定标记的循环。

语法
labelName: for ... {
    for ... {
        if condition {
            break labelName  // 跳出指定标记的循环
        }
    }
}

用例

outerLoop: for i in 1...3 {
    for j in 1...3 {
        print("i = \(i), j = \(j)")
        if i == 2 && j == 2 {
            print("Breaking outer loop")
            break outerLoop  // 跳出外层循环
        }
    }
}
输出:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
Breaking outer loop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Azure AI Foundry 正在构建一个技术无障碍的未来世界

我们习以为常的街道和数字世界&#xff0c;往往隐藏着被忽视的障碍——凹凸不平的路面、不兼容的网站、延迟的字幕或无法识别多样化声音的AI模型。这些细节对某些群体而言&#xff0c;却是日常的挑战。正如盲道不仅帮助视障者&#xff0c;也优化了整体城市体验&#xff0c;信息…

地毯填充luogu

P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主…

哈喽打车 小程序 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 这一次遇到这种风控感觉挺有…

基于 Vue 3 + Express 的网盘资源搜索与转存工具,支持响应式布局,移动端与PC完美适配

一个基于 Vue 3 Express 的网盘资源搜索与转存工具&#xff0c;支持响应式布局&#xff0c;移动端与PC完美适配&#xff0c;可通过 Docker 一键部署。 功能特性 &#x1f50d; 多源资源搜索 支持多个资源订阅源搜索支持关键词搜索与资源链接解析支持豆瓣热门榜单展示 &#…

【操作系统学习篇-Linux】进程

1. 什么是进程 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体。 如果你就看这个来理解进程&#xff0c;那么恭喜你&#xff0c;作为初学者&#xff0c;你…

CF985G Team Players

我敢赌&#xff0c;就算你知道怎么做&#xff0c;也必然得调试半天才能 AC。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 图片来自洛谷。 [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 显然不可能正面计算。所以…

企业经营决策风险

在企业的经营过程中&#xff0c;领导者每天都在面对大量的决策——该扩大生产还是收缩业务&#xff1f;该增设销售渠道还是提升产品质量&#xff1f;但你知道吗&#xff0c;企业最大的成本&#xff0c;不是生产成本&#xff0c;也不是人工成本&#xff0c;而是决策错误的成本&a…

UE5蓝图实现打开和关闭界面、退出

Button_Back 和Button_Exit是创建的两个按钮事件。 1.Create Widget 创建界面&#xff08;打开界面&#xff09; 2.Add to Viewport 添加到视图 3.remove form Parent&#xff0c;Target&#xff1a;self 从父节点移除当前界面&#xff08;关闭界面&#xff09; 4.Quit Game 退…

JavaWeb 课堂笔记 —— 09 MySQL 概述 + DDL

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…

echarts 图表

echart快速上手 快速上手 - 使用手册 - Apache EChartshttps://echarts.apache.org/handbook/zh/get-started/

无线通信网

1.2.4G相邻信道间有干扰&#xff0c;5G相邻信道几乎无干扰 2.2.4G频段的优点是信号强&#xff0c;衰减小&#xff0c;穿墙强&#xff0c;覆盖距离远&#xff1b;缺点是带宽较窄&#xff0c;速度较慢&#xff0c;干扰较大。 5G频段的优点是带宽较宽&#xff0c;速度较快&#…

数据结构:哈希表 | C++中的set与map

上回说到&#xff0c;红黑树是提升了动态数据集中频繁插入或删除操作的性能。而哈希表(Hash Table)&#xff0c;则是解决了传统数组或链表查找数据必须要遍历的缺点。 哈希表 哈希表的特点就是能够让数据通过哈希函数存到表中&#xff0c;哈希函数能够将数据处理为表中位置的索…

容器初始化Spring Boot项目原理,即web项目(war)包涉及相关类对比详解

以下是关于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的对比详解及总结表格&#xff1a; 1. 核心对比详解 (1) SpringBootServletInitializer 作用&#xff1a; S…

[ctfshow web入门] web29

前置知识 eval: 把字符串按照 PHP 代码来执行&#xff0c;例如eval(“echo 1;”);这个函数拥有回显 system&#xff1a;使php程序执行系统命令&#xff0c;例如&#xff0c;system(“ls”);就是查看当前目录&#xff0c;这个拥有回显 preg_match&#xff1a;查找字符串是否匹配…

5.JVM-G1垃圾回收器

一、什么是G1 二、G1的三种垃圾回收方式 region默认2048 三、YGC的过程(Step1) 3.1相关代码 public class YGC1 {/*-Xmx128M -XX:UseG1GC -XX:PrintGCTimeStamps -XX:PrintGCDetails -XX:UnlockExperimentalVMOptions -XX:G1LogLevelfinest128m5% 60%6.4M 75M*/private stati…

Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(一)

01 查表法 在 our_arm_cos_f32 函数中&#xff0c;查表&#xff08;Look-Up Table, LUT&#xff09; 的核心是 预计算的正弦值表 sinTable_f32&#xff0c;通过巧妙利用余弦与正弦的相位关系实现快速余弦计算。以下是详细解析&#xff1a; 1. 查的是什么表&#xff1f; (1) 表内…

机械臂只有位置信息是否可以进行手眼标定?

平常我在做手眼标定时&#xff0c;一般都是通过OpenCV的cv::calibrateHandEye函数进行求解&#xff0c;需要输入多组不同的机械臂位姿。今天遇到了一款舵机机器人&#xff0c;只能获取位置&#xff0c;得不到姿态信息&#xff0c;想着那就把姿态都设为0&#xff0c;结果求不出来…

Python 数据分析01 环境搭建教程

Python 数据分析01 环境搭建教程 一、安装 Python 环境 访问 Python 官方网站 Python 官网&#xff0c;选择适合你操作系统的 Python 版本进行下载。下载完成后&#xff0c;运行安装程序。在安装过程中&#xff0c;建议选择“Add Python to PATH”选项&#xff0c;这样可以在…

使用 Visual Studio 2022 (VS2022) 编译 FreeCAD 1.0.0 的详细教程

一、环境准备 官方教程&#xff1a;在 Windows 上编译 - FreeCAD Documentation Windows 10/11&#xff08;推荐&#xff09; git vs2022 cmake 3.26.4 Doxygen1.12 二、获取源码与依赖 版本关系 打开Git Bash或CMD&#xff0c;执行以下命令 git clone --recurse-sub…

蓝桥杯单片机频率

long int Freq; unsigned int Timer_1000Ms; 加上 TMOD | 0x05; void Timer0Init(void) //0毫秒12.000MHz {AUXR & 0x7F; //定时器时钟12T模式TMOD & 0xF0; //设置定时器模式TMOD | 0x05;TL0 0x00; //设置定时初值TH0 0x00; //设置定时初值TF0 0; //清除TF0标…