To stride through a range, one needs to use advanced(by:), which takes a signed integer value. This poses no practical restriction: semantically, all strideable numeric types (whether signed or unsigned) must have a signed Stride because the type must be able to represent both positive and negative distances (since the distance from a larger positive number to a smaller positive number is negative). And indeed, all concrete unsigned integer types in the standard library have signed Stride types.
If I recall, the reason that the protocol itself, UnsignedInteger, doesn't happen to require a signed Stride is that the ability to express such a constraint in Swift was not worked out in time for this to be changed before ABI stability. So, it is just a matter of writing class Foo<N: UnsignedInteger where N.Stride: SignedInteger> { ... } here and similar boilerplate elsewhere.