[swift-users] protocol definition question

Kevin Nattinger swift at nattinger.net
Thu Dec 14 00:30:03 CST 2017


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 Array: Arrayable {
    func asArray() -> [Element] {
        return self
    }
}

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 at 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?
>  
> Thanks for any assistance,
> Frank
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org <mailto:swift-users at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-users <https://lists.swift.org/mailman/listinfo/swift-users>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171213/b7219274/attachment.html>


More information about the swift-users mailing list