public protocol RawBits: CustomStringConvertible, Collection {
associatedtype RawValue
var rawValue: RawValue { get set }
}
extension RawBits where RawValue: FixedWidthInteger, RawValue:
UnsignedInteger {
[...fields and methods are defined here...]
}
struct RawBits8: RawBits {
var rawValue: UInt8
}
This all works fine.
Now I want to be able to define an extension to which the following would
conform:
struct RawBitsX: RawBits {
var rawValue: [UInt8]
}
rawValue is now an array rather than a simple type. I can't for the life of
me figure out how to indicate this in the 'where' clause of an extension to
RawBits. Can this be done? How?
If you want to match [UInt8] specifically, just use the non-sugared definition:
extension RawBits where RawValue == Array<UInt8> {
}
If you want it to match any array, that’s more complicated. As far as I’ve been able to work out, you have to wrap it in a protocol. Most of Array’s usefulness comes from protocols anyway, so you can probably use Sequence, Collection, or one or more of the more specific Mutable/RandomAccess/RangeReplaceableCollection protocols.
extension RawBits where RawValue: Collection {
}
If you really need an array specifically, as far as I can tell you have to use a pattern I’ve used for a similar purpose with optionals:
protocol Arrayable {
associatedtype T
func asArray() -> [T]
}
extension RawBits where RawValue: Arrayable {
func foo() {
let ary = rawValue.asArray()
// ary is now an Array.
}
}
It’s rather unfortunate this requires a somewhat ugly workaround, but, well, it’s not the worst or most commonly encountered of the shortcomings in the type system.
···
On Dec 13, 2017, at 9:42 PM, Frank Swarbrick via swift-users <swift-users@swift.org> wrote:
I have the following:
public protocol RawBits: CustomStringConvertible, Collection {
associatedtype RawValue
var rawValue: RawValue { get set }
}
extension RawBits where RawValue: FixedWidthInteger, RawValue: UnsignedInteger {
[...fields and methods are defined here...]
}
struct RawBits8: RawBits {
var rawValue: UInt8
}
This all works fine.
Now I want to be able to define an extension to which the following would conform:
struct RawBitsX: RawBits {
var rawValue: [UInt8]
}
rawValue is now an array rather than a simple type. I can't for the life of me figure out how to indicate this in the 'where' clause of an extension to RawBits. Can this be done? How?