Swift Operators

Episode #127 | 10 minutes | published on July 10, 2014
Subscribers Only
One of Swift's powerful features is the ability to define custom operators. In this episode we take a look at two examples of custom operators, one for easy regular expression matching, and another for computing the dot product between two vectors.

Episode Links

A Regular Expression Matching Operator

import Foundation

class Regex {
  let pattern: String

  init(_ pattern: String) {
    self.pattern = pattern
  }

  func test(input: String) -> Bool {
    let range = input.rangeOfString(pattern, options: .RegularExpressionSearch)
    return range != nil
  }
}

infix operator =~ {}

func =~(input: String, pattern: String) -> Bool {
  return Regex(pattern).test(input)
}

You can use this simply:

let input = "09182a4" // take out the "a" and it will match
if input =~ "^\\d+$" {
  println("Matches")
} else {
  println("doesn't match")
}

An operator for Dot Product

Given a struct that represents a vector:

struct Vector {
  let x: Float
  let y: Float

  func dotProduct(other: Vector) -> Float {
    return x * other.x + y * other.y
  }
}

You can simplify calling the dot product with a custom operator like this:

let a = Vector(x: 1, y: 8)
let b = Vector(x: 6, y: 2)

infix operator .. {}

func ..(a: Vector, b: Vector) -> Float {
  return a.dotProduct(b)
}

let result = a .. b

println("The dot product is \(result)")

Note that while this feature is very enticing, you should take care not to abuse it. It can harm readability of your code and I would only use this in cases where I used this function Everywhere and I wanted a terse (but not mysterious) syntax.

blog comments powered by Disqus