[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