762 字
4 分钟
Swift 高级运算符与构建器语法
Swift 中,位运算符、溢出控制、自定义运算、构建器语法(Result Builders)的实现与应用。
位运算符
位运算符允许直接操作数据的二进制位,常用于底层编程(如硬件交互或数据编码)。Swift支持所有C语言的位运算符,并优化了行为特性。
-
按位取反(~)
反转所有二进制位,0变1,1变0。let initialBits: UInt8 = 0b00001111let invertedBits = ~initialBits // 结果:0b11110000(十进制240) -
按位与(&)和或(|)
- &:仅当两数对应位均为1时结果为1。
let firstSixBits: UInt8 = 0b11111100let lastSixBits: UInt8 = 0b00111111let middleFourBits = firstSixBits & lastSixBits // 结果:0b00111100(十进制60)
- |:任意一数对应位为1时结果为1。
let someBits: UInt8 = 0b10110010let moreBits: UInt8 = 0b01011110let combinedBits = someBits | moreBits // 结果:0b11111110(十进制254)
- &:仅当两数对应位均为1时结果为1。
-
按位异或(^)
对应位不同时结果为1,相同时为0。let firstBits: UInt8 = 0b00010100let otherBits: UInt8 = 0b00000101let outputBits = firstBits ^ otherBits // 结果:0b00010001(十进制17) -
位移运算符(<< 和 >>)
用于数值的快速乘除运算,支持无符号数的逻辑位移和有符号数的算术位移。let shiftBits: UInt8 = 4 // 0b00000100shiftBits << 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 +-: AdditionPrecedenceextension 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布局)。
实现绘图构建器:
@resultBuilderstruct 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/