Swift Tricks

Some useful functions that make life easier

Here are some quick Swift functions that can make your life easier. First, a function that splits up an array into head and tail:

extension Array {
    var match : (head: T, tail: [T])? {
      return (count > 0) ? (self[0],Array(self[1..<count])) : nil
    }
}

You can use it like this:

func map<A,B>(f: A -> B, arr: [A]) -> [B] {
    if let (head,tail) = arr.match {
        return [f(head)] + map(f, tail)
    } else {
        return []
    }
}

If you lazily want to generate a list of things, but don’t really know how many will be needed, you can use a Generator. It turns out there’s a type GeneratorOf that makes it really easy for us to define one. For example, this is how you can generate an infinite list of numbers:

func naturalNumbers() -> GeneratorOf<Int> {
    var i = 0
    return GeneratorOf { return i++ }
}

You can now just iterate over the generator it with for..in:

for x in naturalNumbers() {
    println("x: \(x)")
}

Finally, a sketch of how you could wrap NSScanner to have a more Swift-like API:

struct Scanner {
    let scanner : NSScanner

    init(string: String) {
        scanner = NSScanner(string: string)
    }

    func scanInt() -> Int? {
        var int : CInt = 0
        let didScan = scanner.scanInt(&int)
        return didScan ? Int(int) : nil
    }

    func scan(token : String) -> Bool {
        return scanner.scanString(token, intoString: nil)
    }
}

I hope that these snippets will help a bit in writing cleaner Swift code. Enjoy!