[swift-users] array.first vs. array[0]

Adriano Ferreira adriano.ferreira at me.com
Sat Jan 16 16:46:09 CST 2016


Hi everyone!

I’ve been tinkering with a few sorting algorithms in Swift <https://github.com/adrfer/Sort> and noticed a diference in behaviour when it comes to accessing the first element of a collection.

If the method `first` from `CollectionType` is used, one needs to unwrap the returned optional to use it. Pretty standard stuff... However, if one uses subscripting, no unwrapping is required. 

For example, when using subscripting:

func quickSort(array: [Int]) -> [Int] {

    guard array.count > 1 else { return array }

    let (pivot, rest) = (array[0], array.dropFirst())    // no need to unwrap `pivot` for further use

    let lessThan = rest.filter({ $0 < pivot })

    let greaterThanOrEqual = rest.filter({ $0 >= pivot })

    return quickSort(lessThan) + [pivot] + quickSort(greaterThanOrEqual)
}

But, when using the method `first`:

func quickSort(array: [Int]) -> [Int] {

    guard array.count > 1 else { return array }

    let (pivot, rest) = (array.first, array.dropFirst())

    let lessThan = rest.filter({ $0 < pivot })    // unwrapping `pivot` is not required here

    let greaterThanOrEqual = rest.filter({ $0 >= pivot })    // unwrapping `pivot` is not required here

    return quickSort(lessThan) + [pivot!] + quickSort(greaterThanOrEqual)     // unwrapping `pivot` is now required here
}

Isn’t the subscript supposed to return an optional as well?

Why unwrapping isn't required when `pivot` is used within the `filter` call?

Best,

— A
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160116/e8d653de/attachment.html>


More information about the swift-users mailing list