on Fri Feb 03 2017, Erica Sadun <erica-AT-ericasadun.com> wrote:

>> On Feb 3, 2017, at 2:58 PM, Ben Cohen <[email protected]> wrote:
>> 
>> 
>>> On Feb 3, 2017, at 11:12 AM, Erica Sadun via swift-evolution 
>>> <[email protected]
> <mailto:[email protected]>> 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.

Ben's not arguing that enumerated should stay.  He's just saying that
there's no good reason to provide indexed(), and I agree with that.

-- 
-Dave
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to