762 字
4 分钟
Swift 高级运算符与构建器语法
2025-03-13

Swift 中,位运算符、溢出控制、自定义运算、构建器语法(Result Builders)的实现与应用。


位运算符#

位运算符允许直接操作数据的二进制位,常用于底层编程(如硬件交互或数据编码)。Swift支持所有C语言的位运算符,并优化了行为特性。

  1. 按位取反(~)
    反转所有二进制位,0变1,1变0。

    let initialBits: UInt8 = 0b00001111
    let invertedBits = ~initialBits  // 结果:0b11110000(十进制240)
  2. 按位与(&)和或(|)

    • &:仅当两数对应位均为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)
  3. 按位异或(^)
    对应位不同时结果为1,相同时为0。

    let firstBits: UInt8 = 0b00010100
    let otherBits: UInt8 = 0b00000101
    let outputBits = firstBits ^ otherBits  // 结果:0b00010001(十进制17)
  4. 位移运算符(<< 和 >>)
    用于数值的快速乘除运算,支持无符号数的逻辑位移和有符号数的算术位移。

    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)**形式。

  1. 运算符重载示例
    为自定义类型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)
  2. 定义全新运算符
    创建中缀运算符+-,并指定优先级组:

    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/
作者
lollipopkit
发布于
2025-03-13
许可协议
CC BY-NC-SA 4.0