> On 9 Jun 2016, at 17:11, Dave Abrahams <[email protected]> wrote:
> 
> 
> on Thu Jun 09 2016, Haravikk <swift-evolution-AT-haravikk.me 
> <http://swift-evolution-at-haravikk.me/>> wrote:
> 
>>> On 8 Jun 2016, at 20:53, Dave Abrahams via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>>> on Wed Jun 08 2016, Haravikk <[email protected] 
>>>> <mailto:[email protected]>
>> <mailto:[email protected] <mailto:[email protected]>>> wrote:
>>>> 
>>>> But those shouldn't be the public names.  Perhaps s/box/wrap/ ?
>> 
>> True! So I’m thinking I’ll try to come up with a basic proposal soon,
>> I’m just thinking about how this would be implemented. For example, it
>> may make sense to do this as a protocol that AnyIndex (and other
>> suitable types) can just conform to like so:
>> 
>>      protocol Unwrappable {
>>              associatedtype UnwrappedType
>>              func unwrap<T:UnwrappedType>() -> T?
>>              func unsafeUnwrap<T:UnwrappedType>() -> T
>>      }
>> 
>> I’ve kept the ability to specify a root type that unwrapping can
>> produce, i.e- Comparable in the case of AnyIndex. Not too happy with
>> the name of UnwrappedType, since it’s not intended to be the exact
>> type in most cases, 
> 
> Examples please?

Unfortunately I can’t actually seem to get the above protocol to work, Swift 
won’t accept the associated type on the generic constraints for the methods, it 
complains of it being a non-class/non-protocol type. These kinds of tricky 
generics are very much not a strength of my Swift programming abilities =)

The advantage of being able to declare a base type however is that it helps to 
disambiguate overloads. For example, consider unwrapping on AnyIndex using the 
following method:

        public struct AnyIndex : Comparable {
                public func unsafeUnwrap<T:Comparable>() -> T
        }

I then get myself an AnyIndex and decide I’d like to use it in a subscript like 
so:

        let value = myDictionary[myIndex.unsafeUnwrap()]

Since the unwrapped type is known to at least be of type Comparable, it’s 
obvious to the compiler which subscript I mean. If however no minimum 
conformance is provided (i.e- the above method is unsafeUnwrap<T>() -> T) then 
there are three possibilities (Index, Range and Key, since it’s a dictionary) 
so it produces an error.
It can still be used by assigning the unwrapped value to a variable with 
explicit type, but that’s a bit more verbose than I was hoping for.
Of course it can still fail if my AnyIndex isn’t wrapping a DictionaryIndex, 
but the extra type information at least prevents me from using the unwrapping 
somewhere that a Comparable can’t possibly be used.

So in my code this so far means I’m having to stick with adding the methods 
directly to my AnyIndex substitute rather than to a protocol, as I can put the 
restriction on it this way.

Like I say though, complex generic conformance is something I’m still ropey on 
(yet I seem to keep finding myself cases that need it) so it’s possible there’s 
a way to do this that I just can’t think of, or perhaps there are some features 
on their way that would enable this to work as I’m hoping?
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to