[swift-evolution] Removing enumerated?

Erica Sadun erica at ericasadun.com
Fri Feb 3 16:59:46 CST 2017


> On Feb 3, 2017, at 2:58 PM, Ben Cohen <ben_cohen at apple.com> wrote:
> 
> 
>> On Feb 3, 2017, at 11:12 AM, Erica Sadun via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> I believe what people *want* is `indexed` over `enumerated`, and consistently for both array and array slices.
>> 
> 
> I don’t know if that’s true.
> 
> Here’s an example (the only use of enumerated) from Alamofire:
> 
> let acceptLanguage = Locale.preferredLanguages.prefix(6).enumerated().map { index, languageCode in
>     let quality = 1.0 - (Double(index) * 0.1)
>     return "\(languageCode);q=\(quality)"
> }.joined(separator: ", ")
> 
> Here the intent is a counter, not indices. They just happen to be the same. But if they’d used indexed() it would certainly hurt readability, albeit midly.
> 
> Suppose there wasn’t an enumerate or an indexed, and zipped was the standard way of doing it. That might lead to another solution:
> 
> let qualities = stride(from: 1.0, to: 0.4, by: -0.1)
> let acceptLanguage = Locale.preferredLanguages.zipped(with: qualities).map {
>     languageCode, quality in "\(languageCode);q=\(quality)"
> }.joined(separator: ", ")
> 
> The use of stride here feels more what was intended, rather than backing into the quality via an “index” value. And avoids any risk with indexed of this getting applied incorrectly to slices.
> 

I think enumerated as it stands is an attractive nuisance / moral hazard. Most of the language learners I interact with miss the point and the nuance of how it works.

let list = [0, 1, 2, 3, 4]
let slice = list[2...3]
for (idx, value) in slice.enumerated() {
    print(idx, value)
}

I think people would not expect 0, 2 / 1, 3. I also don’t think they’d expect the actual outcome from a dictionary, whether index or enumeration because there’s no inherent semantic “enumeration” of dictionary values:

 
let dict = [0:"a", 1:"b", 2:"c"]
for (idx, value) in dict.enumerated() {
    print(idx, value)
}

0 (2, "c")
1 (0, "a")
2 (1, "b")

I’d like to see enumerated gone and I have a mild preference for introducing indexed, either under its own name or as a new behavior for enumerated (although T where T.Iterator.Element is Int)

120 gists with “enumerated”, of which a casual scan shows that almost none of them are actually using it meaningfully. (Take a look.) I think I did this API right: https://api.github.com/search/repositories?q=enumerate+language:swift <https://api.github.com/search/repositories?q=enumerate+language:swift> and if so, not much in repos.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170203/8d43eb06/attachment.html>


More information about the swift-evolution mailing list