Swift 中的基本运算符:从加减乘除到逻辑与或非

运算符(Operator)到底是什么?

  • 运算符 = 用来「检查、改变、合并」值的特殊符号或短语。
  • 操作数(Operand) = 被运算符影响的值。
  • 按操作数个数分类:
    • 一元(Unary):-a!bc!
    • 二元(Binary):a + b
    • 三元(Ternary):Swift 只有 a ? b : c

赋值运算符(Assignment Operator)

  1. 不会返回值,杜绝了 C/Obj-C 中容易写错的 if (x = y) 问题。
  2. 支持「元组解构」一次性赋多个值。
swift 复制代码
let (x, y) = (1, 2)          // x = 1, y = 2
// if x = y { ... }            // ❌ 编译错误,赋值不返回 Void 以外的东西

算术运算符(Arithmetic Operators)

运算符 含义
+
-
*
/
% 取余
  1. 默认「溢出检查」

Swift 会主动阻止值溢出;若需要溢出行为,用「溢出运算符」&+ &- &*

swift 复制代码
let a = Int.max
let b = a &+ 1               // 显式允许溢出,得到 Int.min
  1. + 也能拼接字符串
swift 复制代码
let hello = "Hello, "
let world = "World!"
let greeting = hello + world // "Hello, World!"
  1. 取余运算符 % 的特点
  • 对负数照样适用,符号跟随第一个操作数。
  • b 为负时会被忽略,即 a % b == a % -b
swift 复制代码
9 % 4        // 1
-9 % 4       // -1
9 % -4       // 1(与 9 % 4 相同)

一元运算符(Unary Operators)

运算符 作用 示例
- 取相反数 -num
+ 返回自身(无计算),可与 - 形成对称 +num

复合赋值运算符(Compound Assignment Operators)

把「计算 + 赋值」合二为一,写法与 C 一致:

swift 复制代码
var a = 5
a += 3        // 等价于 a = a + 3
a *= 2        // a = 10

注意:复合赋值没有返回值,所以 let b = a += 2 是非法的。

比较运算符(Comparison Operators)

全返回 Bool

运算符 含义
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
  1. 元组比较(从左到右「字典序」)

要求:同类型、同数量,且对应元素都能比较。

swift 复制代码
(1, "zebra") < (2, "apple")   // true,先比 1<2,后面不再看
(3, "apple") < (3, "bird")    // true,首元素同,继续比 "apple"<"bird"
(4, "dog") == (4, "dog")      // true

如果元素含不可比较类型(如 Bool 不支持 <),则编译器直接报错。

三元条件运算符(Ternary Conditional)

Swift 唯一的三元运算符:question ? answer1 : answer2

swift 复制代码
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)

优点:简洁;缺点:嵌套过多可读性差。官方建议不要连续多个三元嵌套。

空合运算符(Nil-Coalescing Operator)

语法:a ?? b

  • a 必须是 Optional 类型
  • a 有值则解包返回,否则返回 b
  • b 的类型必须与 a 内部存储类型一致
swift 复制代码
var userPick: String? = nil
let defaultColor = "red"
let color = userPick ?? defaultColor   // "red"

userPick = "green"
let newColor = userPick ?? defaultColor // "green"

区间运算符(Range Operators)

Swift 提供三种常用区间,写法比 C 更直观:

  1. 闭区间 a...b(含 b)
swift 复制代码
for index in 1...5 {          // 1,2,3,4,5
    print(index)
}
  1. 半开区间 a..<b(不含 b)
swift 复制代码
let names = ["A", "B", "C", "D"]
for i in 0..<names.count {    // 0,1,2,3
    print(names[i])
}
  1. 单侧区间(One-Sided Range)

省略一侧即可,常用于「从某索引到末尾」或「从头开始到某索引」:

swift 复制代码
let nums = [10, 20, 30, 40, 50]
let suffix = nums[2...]        // [30, 40, 50]
let prefix = nums[..<2]        // [10, 20]
let slice = nums[1...3]        // [20, 30, 40]

注意:省略起始值的单侧区间不能用于 for-in,因为编译器不知道从哪里开始。

逻辑运算符(Logical Operators)

运算符 读法 特点
!(a) not a 一元,前置
a && b a and b 两真才真,短路
`a b`
  1. 短路示例
swift 复制代码
if (false && someFunc()) {
    // someFunc() 根本不会被执行
}
  1. 多条件组合 + 括号提升可读性
swift 复制代码
let enteredDoorCode = true
let passedRetinaScan = false
let hasDoorKey = false
let knowsOverride = true

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverride {
    print("开门放行")
}

经验:复杂逻辑务必用括号分组,哪怕优先级本就对------可读性第一。

相关推荐
HarderCoder2 小时前
Swift 中“特性开关”实战笔记——用编译条件+EnvironmentValues优雅管理Debug/TestFlight/AppStore三环境
ios·swift
HarderCoder2 小时前
Swift 并发任务中到底该不该用 `[weak self]`?—— 从原理到实战一次讲透
ios·swift
FeliksLv3 小时前
iOS 集成mars xlog
ios
2501_915106325 小时前
CDN 可以实现 HTTPS 吗?实战要点、部署模式与真机验证流程
网络协议·http·ios·小程序·https·uni-app·iphone
大熊猫侯佩7 小时前
天网代码反击战:Swift 三元运算符的 “一行破局” 指南
swiftui·swift·apple
大熊猫侯佩1 天前
在肖申克监狱玩转 iOS 26:安迪的 Liquid Glass 复仇计划
ios·swiftui·swift
大熊猫侯佩1 天前
用最简单的方式让 SwiftUI 画一颗爱你的小红心
swiftui·swift·apple