[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