Why does RangeReplaceableCollection require an empty initialiser?

RangeReplaceableCollection has three initialisers: init(), init(_:) and init(repeating:count:). The latter two are implemented using the empty initialiser. But why are these initialisers part of this particular protocol? As far as I can tell, no other methods of this protocol depend on these initialisers. The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.

For instance, I was making an array that works with any Strideable indices, not just integers. A startIndex is needed for its initialisation, so I can’t really conform it to RangeReplaceableCollection. If I do it anyways (with a fatalError() in the required empty initialiser) everything seems to work just fine, except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new) different protocol?

I have the same misgivings. The other day, I was wanted to add a piece
of metadata to a Slice type conforming to RangeReplaceableCollection
(coming from the containing collection) but couldn't figure out a way to
make it safe with the empty initializer. It's bugged me a few times
similarly.

Cheers!
Zachary Waldowski
zach@waldowski.me

···

On Wed, Jul 6, 2016, at 04:09 AM, Tim Vermeulen via swift-users wrote:

RangeReplaceableCollection has three initialisers: init(), init(_:) and
init(repeating:count:). The latter two are implemented using the empty
initialiser. But why are these initialisers part of this particular
protocol? As far as I can tell, no other methods of this protocol depend
on these initialisers. The requirement of the empty initialiser makes it
impossible to have a collection conform to this protocol that needs
additional data for its initialisation.

For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its
initialisation, so I can’t really conform it to
RangeReplaceableCollection. If I do it anyways (with a fatalError() in
the required empty initialiser) everything seems to work just fine,
except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new) different
protocol?
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

RangeReplaceableCollection has three initialisers: init(), init(_:)
and init(repeating:count:). The latter two are implemented using the
empty initialiser. But why are these initialisers part of this
particular protocol? As far as I can tell, no other methods of this
protocol depend on these initialisers. The requirement of the empty
initialiser makes it impossible to have a collection conform to this
protocol that needs additional data for its initialisation.

This is an excellent point, and I think it may have been an oversight
that we made this a requirement. Please open a bug and/or file a radar.

Thanks!

···

on Wed Jul 06 2016, Tim Vermeulen <swift-users-AT-swift.org> wrote:

For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its
initialisation, so I can’t really conform it to
RangeReplaceableCollection. If I do it anyways (with a fatalError() in
the required empty initialiser) everything seems to work just fine,
except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new)
different protocol?

--
Dave

According to the document of Swift 3, Array has already conformed
protocol RangeReplaceableCollection.

Zhaoxin

···

On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users < swift-users@swift.org> wrote:

RangeReplaceableCollection has three initialisers: init(), init(_:) and
init(repeating:count:). The latter two are implemented using the empty
initialiser. But why are these initialisers part of this particular
protocol? As far as I can tell, no other methods of this protocol depend on
these initialisers. The requirement of the empty initialiser makes it
impossible to have a collection conform to this protocol that needs
additional data for its initialisation.

For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its initialisation,
so I can’t really conform it to RangeReplaceableCollection. If I do it
anyways (with a fatalError() in the required empty initialiser) everything
seems to work just fine, except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new) different
protocol?
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Hi there,

The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.

But if there is no guarantee for an empty initializer, you always need a piece of data to create an instance — and when you do heavy "metaprogramming" (generics, protocols…), it can become very hard to supply this additional data.
In those situations, it is very valuable when you can create an object out of thin air…

Tino

According to the document of Swift 3, Array has already conformed protocol RangeReplaceableCollection.

That’s exactly why I also want to conform my wrapper to that protocol? I think there’s a misunderstanding. I’m making a collection that can be subscripted with any index (that conforms to Strideable), but behaves like an array otherwise.

···

On 6 Jul 2016, at 14:03, Zhao Xin <owenzx@gmail.com> wrote:

Zhaoxin

On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
RangeReplaceableCollection has three initialisers: init(), init(_:) and init(repeating:count:). The latter two are implemented using the empty initialiser. But why are these initialisers part of this particular protocol? As far as I can tell, no other methods of this protocol depend on these initialisers. The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.

For instance, I was making an array that works with any Strideable indices, not just integers. A startIndex is needed for its initialisation, so I can’t really conform it to RangeReplaceableCollection. If I do it anyways (with a fatalError() in the required empty initialiser) everything seems to work just fine, except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new) different protocol?
_______________________________________________
swift-users mailing list
swift-users@swift.org <mailto:swift-users@swift.org>
https://lists.swift.org/mailman/listinfo/swift-users

Would this require a swift-evolution review, since it's technically an API
change? (removing the initializer requirement is something I am also
interested in seeing...)

Austin

···

On Wed, Jul 6, 2016 at 7:05 PM, Dave Abrahams via swift-users < swift-users@swift.org> wrote:

on Wed Jul 06 2016, Tim Vermeulen <swift-users-AT-swift.org> wrote:

> RangeReplaceableCollection has three initialisers: init(), init(_:)
> and init(repeating:count:). The latter two are implemented using the
> empty initialiser. But why are these initialisers part of this
> particular protocol? As far as I can tell, no other methods of this
> protocol depend on these initialisers. The requirement of the empty
> initialiser makes it impossible to have a collection conform to this
> protocol that needs additional data for its initialisation.

This is an excellent point, and I think it may have been an oversight
that we made this a requirement. Please open a bug and/or file a radar.
Issues · apple/swift · GitHub

Thanks!

> For instance, I was making an array that works with any Strideable
> indices, not just integers. A startIndex is needed for its
> initialisation, so I can’t really conform it to
> RangeReplaceableCollection. If I do it anyways (with a fatalError() in
> the required empty initialiser) everything seems to work just fine,
> except for the protocol’s three initialisers.
>
> Perhaps these initialisers should be moved to a (possible new)
> different protocol?

--
Dave

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

I thought this was it, but none of the default implementations of RangeReplaceableCollection seem to use this empty initialiser (except for the two other initialisers and `removeAll(keepingCapacity:)`, the latter of which can be implemented using `removeSubrange(_:)` instead). This makes me wonder whether this is the right protocol to put an empty initialiser.

···

On 6 Jul 2016, at 20:12, Tino Heth <2th@gmx.de> wrote:

Hi there,

The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.

But if there is no guarantee for an empty initializer, you always need a piece of data to create an instance — and when you do heavy "metaprogramming" (generics, protocols…), it can become very hard to supply this additional data.
In those situations, it is very valuable when you can create an object out of thin air…

Tino

Then how you defined the index to conform to Strideable? Below code does
work as it seams that you can't use generics in subscripts.

subscript<T:Strideable>(index:T) -> Element

Zhaoxin

···

On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen <tvermeulen@me.com> wrote:

On 6 Jul 2016, at 14:03, Zhao Xin <owenzx@gmail.com> wrote:

According to the document of Swift 3, Array has already conformed
protocol RangeReplaceableCollection.

That’s exactly why I also want to conform my wrapper to that protocol? I
think there’s a misunderstanding. I’m making a collection that can be
subscripted with any index (that conforms to Strideable), but behaves like
an array otherwise.

Zhaoxin

On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users < > swift-users@swift.org> wrote:

RangeReplaceableCollection has three initialisers: init(), init(_:) and
init(repeating:count:). The latter two are implemented using the empty
initialiser. But why are these initialisers part of this particular
protocol? As far as I can tell, no other methods of this protocol depend on
these initialisers. The requirement of the empty initialiser makes it
impossible to have a collection conform to this protocol that needs
additional data for its initialisation.

For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its initialisation,
so I can’t really conform it to RangeReplaceableCollection. If I do it
anyways (with a fatalError() in the required empty initialiser) everything
seems to work just fine, except for the protocol’s three initialisers.

Perhaps these initialisers should be moved to a (possible new) different
protocol?
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

I’m not allowing generic subscripts. The collection is declared as `AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and it can be subscripted with type `Index`.

Either way, it’s not really important. I’m mostly wondering why RangeReplaceableCollection needs an empty initialiser.

···

Then how you defined the index to conform toStrideable? Below code does work as it seams that you can't use generics in subscripts.

subscript<T:Strideable>(index:T) ->Element

Zhaoxin

On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com(mailto:tvermeulen@me.com)>wrote:
>
> > On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com(mailto:owenzx@gmail.com)>wrote:
> > According to the document of Swift 3, Array has already conformed protocolRangeReplaceableCollection.
>
> That’s exactly why I also want to conform my wrapper to that protocol? I think there’s a misunderstanding. I’m making a collection that can be subscripted with any index (that conforms to Strideable), but behaves like an array otherwise.
>
> >
> > Zhaoxin
> >
> > On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users<swift-users@swift.org(mailto:swift-users@swift.org)>wrote:
> > > RangeReplaceableCollection has three initialisers: init(), init(_:) and init(repeating:count:). The latter two are implemented using the empty initialiser. But why are these initialisers part of this particular protocol? As far as I can tell, no other methods of this protocol depend on these initialisers. The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.
> > >
> > > For instance, I was making an array that works with any Strideable indices, not just integers. A startIndex is needed for its initialisation, so I can’t really conform it to RangeReplaceableCollection. If I do it anyways (with a fatalError() in the required empty initialiser) everything seems to work just fine, except for the protocol’s three initialisers.
> > >
> > > Perhaps these initialisers should be moved to a (possible new) different protocol?
> > > _______________________________________________
> > > swift-users mailing list
> > > swift-users@swift.org(mailto:swift-users@swift.org)
> > > https://lists.swift.org/mailman/listinfo/swift-users
> >
>

Yes.

···

on Wed Jul 06 2016, Austin Zheng <austinzheng-AT-gmail.com> wrote:

Would this require a swift-evolution review, since it's technically an API
change? (removing the initializer requirement is something I am also
interested in seeing...)

--
Dave

Now I understood you concerns. Have you ever thought of if a non-empty
RangeReplaceableCollection being removed all of its elements, which makes
the collection to be an empty collection. That shouldn't change the
RangeReplaceableCollection
to be a non-RangeReplaceableCollection. So the empty collection must also
be a RangeReplaceableCollection.

init()

<file:///Users/zhaoxin/Library/Application%20Support/Dash/DocSets/Apple_API_Reference/Apple_API_Reference.docset/Contents/Resources/Documents/developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html>Creates
a new, empty collection.

Zhaoxin

···

On Wed, Jul 6, 2016 at 9:09 PM, Tim Vermeulen <tvermeulen@me.com> wrote:

I’m not allowing generic subscripts. The collection is declared as
`AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and
it can be subscripted with type `Index`.

Either way, it’s not really important. I’m mostly wondering why
RangeReplaceableCollection needs an empty initialiser.

> Then how you defined the index to conform toStrideable? Below code does
work as it seams that you can't use generics in subscripts.
>
>
> subscript<T:Strideable>(index:T) ->Element
>
>
>
>
>
>
> Zhaoxin
>
>
>
>
> On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com(mailto: > tvermeulen@me.com)>wrote:
> >
> > > On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com(mailto: > owenzx@gmail.com)>wrote:
> > > According to the document of Swift 3, Array has already conformed
protocolRangeReplaceableCollection.
> >
> > That’s exactly why I also want to conform my wrapper to that protocol?
I think there’s a misunderstanding. I’m making a collection that can be
subscripted with any index (that conforms to Strideable), but behaves like
an array otherwise.
> >
> > >
> > > Zhaoxin
> > >
> > > On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users< > swift-users@swift.org(mailto:swift-users@swift.org)>wrote:
> > > > RangeReplaceableCollection has three initialisers: init(),
init(_:) and init(repeating:count:). The latter two are implemented using
the empty initialiser. But why are these initialisers part of this
particular protocol? As far as I can tell, no other methods of this
protocol depend on these initialisers. The requirement of the empty
initialiser makes it impossible to have a collection conform to this
protocol that needs additional data for its initialisation.
> > > >
> > > > For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its initialisation,
so I can’t really conform it to RangeReplaceableCollection. If I do it
anyways (with a fatalError() in the required empty initialiser) everything
seems to work just fine, except for the protocol’s three initialisers.
> > > >
> > > > Perhaps these initialisers should be moved to a (possible new)
different protocol?
> > > > _______________________________________________
> > > > swift-users mailing list
> > > > swift-users@swift.org(mailto:swift-users@swift.org)
> > > > https://lists.swift.org/mailman/listinfo/swift-users
> > >
> >
>
>
>

I thought this was it, but none of the default implementations of RangeReplaceableCollection seem to use this empty initialiser

I haven't worked with RangeReplaceableCollection yet, but I wasn't speaking of how the protocol is used in the libraries, but by "regular users":

class Factory<T: RangeReplaceableCollectionType> {
  func create() -> T{
    return T()
  }
}

Doing something like this can become really hard when you need parameters.

You wouldn’t need an empty initialiser to remove all elements from a collection, right? You could just use `replaceRange` instead.

···

Now I understood you concerns. Have you ever thought of if a non-empty RangeReplaceableCollection being removed all of its elements, which makes the collection to be an empty collection. That shouldn't change theRangeReplaceableCollection to be a non-RangeReplaceableCollection. Sothe empty collection must also be aRangeReplaceableCollection.

> init()
(file:///Users/zhaoxin/Library/Application%20Support/Dash/DocSets/Apple_API_Reference/Apple_API_Reference.docset/Contents/Resources/Documents/developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html)> Creates a new, empty collection.

Zhaoxin

On Wed, Jul 6, 2016 at 9:09 PM, Tim Vermeulen<tvermeulen@me.com(mailto:tvermeulen@me.com)>wrote:
> I’m not allowing generic subscripts. The collection is declared as `AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and it can be subscripted with type `Index`.
>
> Either way, it’s not really important. I’m mostly wondering why RangeReplaceableCollection needs an empty initialiser.
>
> >Then how you defined the index to conform toStrideable? Below code does work as it seams that you can't use generics in subscripts.
> >
> >
> >subscript<T:Strideable>(index:T) ->Element
> >
> >
> >
> >
> >
> >
> >Zhaoxin
> >
> >
> >
> >
> >On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com(mailto:tvermeulen@me.com)(mailto:tvermeulen@me.com)>wrote:
> >>
> >>>On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com(mailto:owenzx@gmail.com)(mailto:owenzx@gmail.com)>wrote:
> >>>According to the document of Swift 3, Array has already conformed protocolRangeReplaceableCollection.
> >>
> >>That’s exactly why I also want to conform my wrapper to that protocol? I think there’s a misunderstanding. I’m making a collection that can be subscripted with any index (that conforms to Strideable), but behaves like an array otherwise.
> >>
> >>>
> >>>Zhaoxin
> >>>
> >>>On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users<swift-users@swift.org(mailto:swift-users@swift.org)(mailto:swift-users@swift.org)>wrote:
> >>>>RangeReplaceableCollection has three initialisers: init(), init(_:) and init(repeating:count:). The latter two are implemented using the empty initialiser. But why are these initialisers part of this particular protocol? As far as I can tell, no other methods of this protocol depend on these initialisers. The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.
> >>>>
> >>>>For instance, I was making an array that works with any Strideable indices, not just integers. A startIndex is needed for its initialisation, so I can’t really conform it to RangeReplaceableCollection. If I do it anyways (with a fatalError() in the required empty initialiser) everything seems to work just fine, except for the protocol’s three initialisers.
> >>>>
> >>>>Perhaps these initialisers should be moved to a (possible new) different protocol?
> >>>>_______________________________________________
> >>>>swift-users mailing list
> >>>>swift-users@swift.org(mailto:swift-users@swift.org)(mailto:swift-users@swift.org)
> >>>>https://lists.swift.org/mailman/listinfo/swift-users
> >>>
> >>
> >
> >
> >

N
​o. You didn't catch what I meant. I meant it should be like an equation.
​If foo is a
​RangeReplaceableCollection,

foo
minus
foo
equates zero, zero means an empty collection. Both side of the equation
should be with the same unit, the unit is
RangeReplaceableCollection.
​ Below code also shows init() is useful in
RangeReplaceableCollection.
​​

var foo = Array<Int>()

foo.append(contentsOf: [2,4,6,8])

​Zhaoxin

···

On Wed, Jul 6, 2016 at 10:07 PM, Tim Vermeulen <tvermeulen@me.com> wrote:

You wouldn’t need an empty initialiser to remove all elements from a
collection, right? You could just use `replaceRange` instead.

> Now I understood you concerns. Have you ever thought of if a non-empty
RangeReplaceableCollection being removed all of its elements, which makes
the collection to be an empty collection. That shouldn't change
theRangeReplaceableCollection to be a non-RangeReplaceableCollection. Sothe
empty collection must also be aRangeReplaceableCollection.
>
> > init()
>
(file:///Users/zhaoxin/Library/Application%20Support/Dash/DocSets/Apple_API_Reference/Apple_API_Reference.docset/Contents/Resources/Documents/
developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html)>
Creates a new, empty collection.
>
> Zhaoxin
>
> On Wed, Jul 6, 2016 at 9:09 PM, Tim Vermeulen<tvermeulen@me.com(mailto: > tvermeulen@me.com)>wrote:
> > I’m not allowing generic subscripts. The collection is declared as
`AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and
it can be subscripted with type `Index`.
> >
> > Either way, it’s not really important. I’m mostly wondering why
RangeReplaceableCollection needs an empty initialiser.
> >
> > >Then how you defined the index to conform toStrideable? Below code
does work as it seams that you can't use generics in subscripts.
> > >
> > >
> > >subscript<T:Strideable>(index:T) ->Element
> > >
> > >
> > >
> > >
> > >
> > >
> > >Zhaoxin
> > >
> > >
> > >
> > >
> > >On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com > (mailto:tvermeulen@me.com)(mailto:tvermeulen@me.com)>wrote:
> > >>
> > >>>On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com(mailto: > owenzx@gmail.com)(mailto:owenzx@gmail.com)>wrote:
> > >>>According to the document of Swift 3, Array has already conformed
protocolRangeReplaceableCollection.
> > >>
> > >>That’s exactly why I also want to conform my wrapper to that
protocol? I think there’s a misunderstanding. I’m making a collection that
can be subscripted with any index (that conforms to Strideable), but
behaves like an array otherwise.
> > >>
> > >>>
> > >>>Zhaoxin
> > >>>
> > >>>On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users< > swift-users@swift.org(mailto:swift-users@swift.org)(mailto: > swift-users@swift.org)>wrote:
> > >>>>RangeReplaceableCollection has three initialisers: init(),
init(_:) and init(repeating:count:). The latter two are implemented using
the empty initialiser. But why are these initialisers part of this
particular protocol? As far as I can tell, no other methods of this
protocol depend on these initialisers. The requirement of the empty
initialiser makes it impossible to have a collection conform to this
protocol that needs additional data for its initialisation.
> > >>>>
> > >>>>For instance, I was making an array that works with any Strideable
indices, not just integers. A startIndex is needed for its initialisation,
so I can’t really conform it to RangeReplaceableCollection. If I do it
anyways (with a fatalError() in the required empty initialiser) everything
seems to work just fine, except for the protocol’s three initialisers.
> > >>>>
> > >>>>Perhaps these initialisers should be moved to a (possible new)
different protocol?
> > >>>>_______________________________________________
> > >>>>swift-users mailing list
> > >>>>swift-users@swift.org(mailto:swift-users@swift.org)(mailto:
swift-users@swift.org)
> > >>>>https://lists.swift.org/mailman/listinfo/swift-users
> > >>>
> > >>
> > >
> > >
> > >
>
>
>

The same is true for protocols such as `RandomAccessCollection` and `MutableCollection`.

···

On 6 Jul 2016, at 22:07, Tino Heth <2th@gmx.de> wrote:

I thought this was it, but none of the default implementations of RangeReplaceableCollection seem to use this empty initialiser

I haven't worked with RangeReplaceableCollection yet, but I wasn't speaking of how the protocol is used in the libraries, but by "regular users":

class Factory<T: RangeReplaceableCollectionType> {
  func create() -> T{
    return T()
  }
}

Doing something like this can become really hard when you need parameters.

I never said a RangeReplaceableCollection shouldn’t be empty. I just think it’s strange that it requires an empty initialiser (while the Collection protocol doesn’t).

···

On 6 Jul 2016, at 16:33, Zhao Xin <owenzx@gmail.com> wrote:

N​o. You didn't catch what I meant. I meant it should be like an equation. ​If foo is a ​RangeReplaceableCollection,​ foo minus foo equates zero, zero means an empty collection. Both side of the equation should be with the same unit, the unit is RangeReplaceableCollection.​ Below code also shows init() is useful in RangeReplaceableCollection.​​

var foo = Array<Int>()
foo.append(contentsOf: [2,4,6,8])

​Zhaoxin

On Wed, Jul 6, 2016 at 10:07 PM, Tim Vermeulen <tvermeulen@me.com <mailto:tvermeulen@me.com>> wrote:
You wouldn’t need an empty initialiser to remove all elements from a collection, right? You could just use `replaceRange` instead.

> Now I understood you concerns. Have you ever thought of if a non-empty RangeReplaceableCollection being removed all of its elements, which makes the collection to be an empty collection. That shouldn't change theRangeReplaceableCollection to be a non-RangeReplaceableCollection. Sothe empty collection must also be aRangeReplaceableCollection.
>
> > init()
> (file:///Users/zhaoxin/Library/Application%20Support/Dash/DocSets/Apple_API_Reference/Apple_API_Reference.docset/Contents/Resources/Documents/developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html <http://developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html&gt;\)> Creates a new, empty collection.
>
> Zhaoxin
>
> On Wed, Jul 6, 2016 at 9:09 PM, Tim Vermeulen<tvermeulen@me.com <mailto:tvermeulen@me.com>(mailto:tvermeulen@me.com <mailto:tvermeulen@me.com>)>wrote:
> > I’m not allowing generic subscripts. The collection is declared as `AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and it can be subscripted with type `Index`.
> >
> > Either way, it’s not really important. I’m mostly wondering why RangeReplaceableCollection needs an empty initialiser.
> >
> > >Then how you defined the index to conform toStrideable? Below code does work as it seams that you can't use generics in subscripts.
> > >
> > >
> > >subscript<T:Strideable>(index:T) ->Element
> > >
> > >
> > >
> > >
> > >
> > >
> > >Zhaoxin
> > >
> > >
> > >
> > >
> > >On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com <mailto:tvermeulen@me.com>(mailto:tvermeulen@me.com <mailto:tvermeulen@me.com>)(mailto:tvermeulen@me.com <mailto:tvermeulen@me.com>)>wrote:
> > >>
> > >>>On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com <mailto:owenzx@gmail.com>(mailto:owenzx@gmail.com <mailto:owenzx@gmail.com>)(mailto:owenzx@gmail.com <mailto:owenzx@gmail.com>)>wrote:
> > >>>According to the document of Swift 3, Array has already conformed protocolRangeReplaceableCollection.
> > >>
> > >>That’s exactly why I also want to conform my wrapper to that protocol? I think there’s a misunderstanding. I’m making a collection that can be subscripted with any index (that conforms to Strideable), but behaves like an array otherwise.
> > >>
> > >>>
> > >>>Zhaoxin
> > >>>
> > >>>On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users<swift-users@swift.org <mailto:swift-users@swift.org>(mailto:swift-users@swift.org <mailto:swift-users@swift.org>)(mailto:swift-users@swift.org <mailto:swift-users@swift.org>)>wrote:
> > >>>>RangeReplaceableCollection has three initialisers: init(), init(_:) and init(repeating:count:). The latter two are implemented using the empty initialiser. But why are these initialisers part of this particular protocol? As far as I can tell, no other methods of this protocol depend on these initialisers. The requirement of the empty initialiser makes it impossible to have a collection conform to this protocol that needs additional data for its initialisation.
> > >>>>
> > >>>>For instance, I was making an array that works with any Strideable indices, not just integers. A startIndex is needed for its initialisation, so I can’t really conform it to RangeReplaceableCollection. If I do it anyways (with a fatalError() in the required empty initialiser) everything seems to work just fine, except for the protocol’s three initialisers.
> > >>>>
> > >>>>Perhaps these initialisers should be moved to a (possible new) different protocol?
> > >>>>_______________________________________________
> > >>>>swift-users mailing list
> > >>>>swift-users@swift.org <mailto:swift-users@swift.org>(mailto:swift-users@swift.org <mailto:swift-users@swift.org>)(mailto:swift-users@swift.org <mailto:swift-users@swift.org>)
> > >>>>https://lists.swift.org/mailman/listinfo/swift-users
> > >>>
> > >>
> > >
> > >
> > >
>
>
>

I am not a software scientist. I have to explain things with examples. For
example, in Framework headers.

extension Array : RangeReplaceableCollection {

    /// Creates a new, empty array.
    ///
    /// This is equivalent to initializing with an empty array literal.
    /// For example:
    ///
    /// var emptyArray = Array<Int>()
    /// print(emptyArray.isEmpty)
    /// // Prints "true"
    ///
    /// emptyArray =
    /// print(emptyArray.isEmpty)
    /// // Prints "true"
    public init()

In Swift source code.

extension ${Self} : RangeReplaceableCollection, _ArrayProtocol {

  /// Creates a new, empty array.
  ///
  /// This is equivalent to initializing with an empty array literal.
  /// For example:
  ///
  /// var emptyArray = Array<Int>()
  /// print(emptyArray.isEmpty)
  /// // Prints "true"
  ///
  /// emptyArray =
  /// print(emptyArray.isEmpty)
  /// // Prints "true"
  @_semantics("array.init")
  public init() {
    _buffer = _Buffer()
  }

​So I am confident to say, if there is no protocol limits on init() to be
empty. You can do what ever with Array<Int>(), maybe

l

​et foo = Array<Int>() // means [1] is OK​, as there is no limitation
prohibits you to do so.

​So there always must be a protocol saying init() to be an empty
collection. We just don't know why it is put in ​
RangeReplaceableCollection.
​at the moment.​

Conforming chains(collection part only):

Array:
MutableCollection
​:
Collection:

Sequence

Array:
RandomAccessCollection:
​​
BidirectionalCollection:
​​
Collection

:

Sequence

A​rray:
RangeReplaceableCollection:

Collection​:

Sequence

For Sequence protocol, there is no mutating functions.

For Collection protocol, the mutating functions are removeFirst(),
removeFirst(Int), split(_:_:_) and popFirst(). As you can imaging, an
empty collection can call none of the functions.

For MutableCollection, BidirectionalCollection, RandomAccessCollection, the
situations are similar. They just don't have extra mutating functions nor
an empty collection can't call these mutating functions.

For RangeReplaceableCollection protocol, below mutating function works in
an empty collection

func append<S>(contentsOf: S)

func removeAll(keepingCapacity: Bool)

Maybe that is why the must have init() is put here.

Zhaoxin​

···

On Thu, Jul 7, 2016 at 12:10 AM, Tim Vermeulen <tvermeulen@me.com> wrote:

I never said a RangeReplaceableCollection shouldn’t be empty. I just think
it’s strange that it requires an empty initialiser (while the Collection
protocol doesn’t).

On 6 Jul 2016, at 16:33, Zhao Xin <owenzx@gmail.com> wrote:

N
​o. You didn't catch what I meant. I meant it should be like an equation.
​If foo is a
​RangeReplaceableCollection,

foo
minus
foo
equates zero, zero means an empty collection. Both side of the equation
should be with the same unit, the unit is
RangeReplaceableCollection.
​ Below code also shows init() is useful in
RangeReplaceableCollection.
​​

var foo = Array<Int>()

foo.append(contentsOf: [2,4,6,8])

​Zhaoxin

On Wed, Jul 6, 2016 at 10:07 PM, Tim Vermeulen <tvermeulen@me.com> wrote:

You wouldn’t need an empty initialiser to remove all elements from a
collection, right? You could just use `replaceRange` instead.

> Now I understood you concerns. Have you ever thought of if a non-empty
RangeReplaceableCollection being removed all of its elements, which makes
the collection to be an empty collection. That shouldn't change
theRangeReplaceableCollection to be a non-RangeReplaceableCollection. Sothe
empty collection must also be aRangeReplaceableCollection.
>
> > init()
> (
file:///Users/zhaoxin/Library/Application%20Support/Dash/DocSets/Apple_API_Reference/Apple_API_Reference.docset/Contents/Resources/Documents/
developer.apple.com/reference/swift/rangereplaceablecollection/1641467-init.html)>
Creates a new, empty collection.
>
> Zhaoxin
>
> On Wed, Jul 6, 2016 at 9:09 PM, Tim Vermeulen<tvermeulen@me.com(mailto: >> tvermeulen@me.com)>wrote:
> > I’m not allowing generic subscripts. The collection is declared as
`AnyIndexArray<Index: Strideable, Element where Index.Stride == Int>` and
it can be subscripted with type `Index`.
> >
> > Either way, it’s not really important. I’m mostly wondering why
RangeReplaceableCollection needs an empty initialiser.
> >
> > >Then how you defined the index to conform toStrideable? Below code
does work as it seams that you can't use generics in subscripts.
> > >
> > >
> > >subscript<T:Strideable>(index:T) ->Element
> > >
> > >
> > >
> > >
> > >
> > >
> > >Zhaoxin
> > >
> > >
> > >
> > >
> > >On Wed, Jul 6, 2016 at 8:32 PM, Tim Vermeulen<tvermeulen@me.com >> (mailto:tvermeulen@me.com)(mailto:tvermeulen@me.com)>wrote:
> > >>
> > >>>On 6 Jul 2016, at 14:03, Zhao Xin<owenzx@gmail.com(mailto: >> owenzx@gmail.com)(mailto:owenzx@gmail.com)>wrote:
> > >>>According to the document of Swift 3, Array has already conformed
protocolRangeReplaceableCollection.
> > >>
> > >>That’s exactly why I also want to conform my wrapper to that
protocol? I think there’s a misunderstanding. I’m making a collection that
can be subscripted with any index (that conforms to Strideable), but
behaves like an array otherwise.
> > >>
> > >>>
> > >>>Zhaoxin
> > >>>
> > >>>On Wed, Jul 6, 2016 at 7:09 PM, Tim Vermeulen via swift-users< >> swift-users@swift.org(mailto:swift-users@swift.org)(mailto: >> swift-users@swift.org)>wrote:
> > >>>>RangeReplaceableCollection has three initialisers: init(),
init(_:) and init(repeating:count:). The latter two are implemented using
the empty initialiser. But why are these initialisers part of this
particular protocol? As far as I can tell, no other methods of this
protocol depend on these initialisers. The requirement of the empty
initialiser makes it impossible to have a collection conform to this
protocol that needs additional data for its initialisation.
> > >>>>
> > >>>>For instance, I was making an array that works with any
Strideable indices, not just integers. A startIndex is needed for its
initialisation, so I can’t really conform it to RangeReplaceableCollection.
If I do it anyways (with a fatalError() in the required empty initialiser)
everything seems to work just fine, except for the protocol’s three
initialisers.
> > >>>>
> > >>>>Perhaps these initialisers should be moved to a (possible new)
different protocol?
> > >>>>_______________________________________________
> > >>>>swift-users mailing list
> > >>>>swift-users@swift.org(mailto:swift-users@swift.org)(mailto:
swift-users@swift.org)
> > >>>>https://lists.swift.org/mailman/listinfo/swift-users
> > >>>
> > >>
> > >
> > >
> > >
>
>
>