I keep running myself into this issue when I try using some of my generic 
classes built on top of Protocols. 

I have a TimeSeries protocol which has an Underlying (Float, Double, .. 
whatever) and also a Self requirement because you can return a sub series. 
There’s more to the protocol but this is enough for example

public protocol TimeSeries 
{
        typealias Underlying
        mutating func addValue( value : Underlying, tick : Int )
        func subSeriesFromTick( tick : Int )->Self
}

I have two concrete implementers of this protocol, a FullTimeSeries which is a 
memory pig and a CompressedTimeSeries which usually isn't

public struct FullTimeSeries<T> : TimeSeries
{
        public typealias Underlying = T

        // implementation
}

public struct CompressedTimeSeries<T> : TimeSeries
{
        public typealias Underlying = T

        // implementation
}

These work just fine. Now I want a UIView which shows a TimeSeries, in this 
case actually a TimeSeries of Floats, of course the code below doesn’t work

public class TimeSeriesView : UIView
{
        public typelias Underlying = Float
        public var timeSeries : TimeSeries
}

"Protocol 'TimeSeries' can only be used as a generic constraint because it has 
Self or associated type requirements”, my least favourite error message which 
always pops up just after I’ve done all the work and just before I get to use 
the fruits of my labour. I never see it coming. 

The typealias in the above code doesn’t do anything of course, it was just me 
having an attempt. 

I want to say that timeSeries is any TimeSeries with an underlying type of 
Float, but you can’t. I wanted to have a generic UIView I could just stuff a 
TimeSeries of Floats into and it would show it. 

The best I can come up with is to parameterise on T, which is a TimeSeries

public class TimeSeriesView<T:TimeSeries>
{
        public typealias Underlying = Float
        public var timeSeries : T
}

now I have to create the correct TimeSeriesView<FullTimeSeries<Float>> or 
TimeSeriesView<CompressedTimeSeries<Float>>, which wasn’t really what I wanted 
to do. 

There’s still no clever way around this right, this is still how Generics and 
Protocols work together, there’s nothing in Swift 2.0 which helps you work 
around this, no way to use Protocol extensions to do it? I thought (I’ve tried 
this before) of making a FloatTimeSeries protocol which only deals with Floats 
and has no Self or associated type issues which basically has all the same 
methods of TimeSeries but with ‘Float’ specifically instead of Underlying and 
then using a protocol extension like this

extension FullTimeSeries : FloatTimeSeries where T:Float
{
}

but Swift has you covered on that one too .. "Extension of type 
'FullTimeSeries' with constraints cannot have an inheritance clause”

Nothing from last years WWDC I missed here? You still can’t do this, right? 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to