762 字
4 分钟
Swift 高级运算符与构建器语法
Swift 中,位运算符、溢出控制、自定义运算、构建器语法(Result Builders)的实现与应用。
位运算符
位运算符允许直接操作数据的二进制位,常用于底层编程(如硬件交互或数据编码)。Swift支持所有C语言的位运算符,并优化了行为特性。
按位取反(~)
反转所有二进制位,0变1,1变0。let initialBits: UInt8 = 0b00001111 let invertedBits = ~initialBits // 结果:0b11110000(十进制240)
按位与(&)和或(|)
- &:仅当两数对应位均为1时结果为1。
let firstSixBits: UInt8 = 0b11111100 let lastSixBits: UInt8 = 0b00111111 let middleFourBits = firstSixBits & lastSixBits // 结果:0b00111100(十进制60)
- |:任意一数对应位为1时结果为1。
let someBits: UInt8 = 0b10110010 let moreBits: UInt8 = 0b01011110 let combinedBits = someBits | moreBits // 结果:0b11111110(十进制254)
- &:仅当两数对应位均为1时结果为1。
按位异或(^)
对应位不同时结果为1,相同时为0。let firstBits: UInt8 = 0b00010100 let otherBits: UInt8 = 0b00000101 let outputBits = firstBits ^ otherBits // 结果:0b00010001(十进制17)
位移运算符(<< 和 >>)
用于数值的快速乘除运算,支持无符号数的逻辑位移和有符号数的算术位移。let shiftBits: UInt8 = 4 // 0b00000100 shiftBits << 2 // 左移两位得0b00010000(16) shiftBits >> 1 // 右移一位得0b00000010(2)
溢出运算符
Swift默认禁止算术溢出,但可通过溢出运算符(如&+
, &-
, &*
)主动触发溢出行为。
var unsignedOverflow = UInt8.max // 255(二进制11111111)
unsignedOverflow &+ 1 // 溢出后归零(0)
var signedOverflow = Int8.min // -128(二进制10000000)
signedOverflow &- 1 // 溢出后变为127(01111111)
应用场景:加密算法、循环缓冲区等需要显式处理溢出的场景。
自定义运算符
Swift允许重载现有运算符或定义全新的运算符,支持中缀(infix)、前缀(prefix)、**后缀(postfix)**形式。
运算符重载示例
为自定义类型Vector2D
实现加法:struct Vector2D { var x, y: Double } extension Vector2D { static func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y) } } let combinedVector = Vector2D(x: 3, y: 1) + Vector2D(x: 2, y: 4) // (5.0, 5.0)
定义全新运算符
创建中缀运算符+-
,并指定优先级组:infix operator +-: AdditionPrecedence extension Vector2D { static func +- (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y - right.y) } }
构建器语法(Result Builders)
通过@resultBuilder
可创建领域特定语言(DSL),简化嵌套结构的生成(如HTML、UI布局)。
实现绘图构建器:
@resultBuilder
struct DrawingBuilder {
static func buildBlock(_ components: Drawable...) -> Drawable {
Line(elements: components)
}
static func buildEither(first: Drawable) -> Drawable { first }
static func buildEither(second: Drawable) -> Drawable { second }
}
func draw(@DrawingBuilder content: () -> Drawable) -> Drawable { content() }
// 使用构建器生成动态内容
let greeting = draw {
Stars(length: 3)
Text("Hello")
if let name = name { Text(name) } else { Text("World") }
}
关键方法:
buildBlock
:组合多个元素。buildEither
:支持条件分支(如if-else
)。buildArray
:支持循环(如for
)。
运算符优先级与结合性
Swift的运算符优先级规则与C类似,但更简洁明确。自定义中缀运算符需指定优先级组以避免歧义:
infix operator ^^: MultiplicationPrecedence // 优先级同乘除法
Swift 高级运算符与构建器语法
https://blog.lpkt.cn/posts/swift-adv-op/