[swift-evolution] [Pitch] Improve `init(repeating:count)`
Dave Abrahams
dabrahams at apple.com
Sat Sep 9 12:27:06 CDT 2017
on Fri Aug 18 2017, Erica Sadun
<swift-evolution at swift.org> wrote:
>> On Aug 17, 2017, at 9:29 PM, Taylor Swift
>> <kelvin13ma at gmail.com>
> wrote:
>> On Thu, Aug 17, 2017 at 9:06 PM, Erica Sadun via
>> swift-evolution
>> <swift-evolution at swift.org
>> <mailto:swift-evolution at swift.org>>
>> wrote:
>
>>
>>> On Aug 17, 2017, at 6:56 PM, Xiaodi Wu
>>> <xiaodi.wu at gmail.com
>>> <mailto:xiaodi.wu at gmail.com>>
>>> wrote: On Thu, Aug 17, 2017 at 7:51 PM, Erica Sadun
>>> <erica at ericasadun.com
>>> <mailto:erica at ericasadun.com>> wrote:
>>> What people are doing is taking a real set of values (1, 2, 3,
>>> 4, 5, for example), then discarding them via `_ in`, which is
>>> different from `Void -> T` or `f(x) = 0 * x`. The domain could
>>> just as easily be (Foo(), "b", đź’©, UIColor.red, { x: Int in
>>> x^x }). There are too many semantic shifts away from "I would
>>> like to collect the execution of this closure n times" for it
>>> to sit comfortably. What arguments might help to alleviate
>>> this discomfort? Clearly, functions exist that can map this
>>> delightfully heterogeneous domain to some sort of range that
>>> the user wants. Would you feel better if we wrote instead the
>>> following? ``` repeatElement((), count: 5).map { UIView() }
>>> ```
>> My favorite solution is the array initializer. Something along
>> the lines of `Array<T>(count n: Int, generator: () -> T)`. I'm
>> not sure it _quite_ reaches standard library but I think it is
>> a solid way to say "produce a collection with a generator run n
>> times". It's a common task. I was asking around about this, and
>> found that a lot of us who work with both macOS and iOS and
>> want to stress test interfaces do this very often. Other use
>> cases include "give me n random numbers", "give me n records
>> from this database", etc. along similar lines. The difference
>> between this and the current `Array(repeating:count:)`
>> initializer is switching the arguments and using a trailing
>> closure (or an autoclosure) rather than a set value. That API
>> was designed without the possibility that you might want to
>> repeat a generator, so there's a bit of linguistic turbulence.
>> -- E To me at least, this is a very i-Centric complaint,
>> since I can barely remember the last time I needed something
>> like this for anything that didn’t involve UIKit. What you’re
>> asking for is API sugar for generating reference types with
>> less typing.
>
> No, that's what the original thread poster wanted.
>
> I want to avoid breaking math.
I know it's late to chime in here, but IMO (mutable) reference
types and the exposure of === “break math,” and I think that's the
real effect you're seeing here.
--
-Dave
More information about the swift-evolution
mailing list