jameslintaylor jameslintaylor - 2 months ago 9
Swift Question

why is this causing so much trouble? (protocols and typealiases on their associated types)

I'm trying to do something along the lines of this:

protocol Protocol {
associatedtype T
associatedtype ArrayT = Array<T>
}

struct Struct<ProtocolType: Protocol> {

func doSomething(with: ProtocolType.ArrayT) {

let _ = with.map { $0 }
// ^ compiler complains on this line
// "value of type ProtocolType.ArrayT has no member map"
}
}


where I define a convenience typealias
ArrayT
that uses the
associatedtype
T
. It seems that when I try to use
ArrayT
like in
doSomething(_:)
, I lose the
Array
type information of
ArrayT
.

Shouldn't
ArrayT
definitely be an
Array
and therefore a member of the
Sequence
protocol, exposing the
map
function?

Answer

The line associatedtype ArrayT = Array<T> only tells the compiler that the default value of ArrayT is Array<T>. An adaption of the protocol can still change ArrayT like:

struct U: Protocol {
    typealias T = UInt32
    typealias ArrayT = UInt64   // <-- valid!
}

If you want a fixed type, you should use a typealias...

// does not work yet.
protocol Protocol {
    associatedtype T
    typealias ArrayT = Array<T>
}

But the compiler complains that the type is too complex

Comments