我可以通过对这些协议的扩展将协议一致性添加到 `UnsignedInteger` 中吗?

Can I add protocol conformance to `UnsignedInteger` via extensions on those protocols?

我有 2 个协议,JSONStringConvertibleJSONSerializable。我希望 Int、Int64、UInt32 等都符合这些协议。

这段代码是我写的

public extension JSONSerializable where Self:Integer, Self:JSONStringConvertible
{
    var jsonObject: JSONStringConvertible { return self }
}
public extension JSONStringConvertible where Self:Integer
{
    var jsonString: String { return "" }
}

但是没用。我必须这样做:

extension Int : JSONStringConvertible, JSONSerializable
{
    public var jsonObject: JSONStringConvertible { return self }
    public var jsonString: String { return String( self ) }
}

我做错了什么?

看看你在这里写了什么:

//                                           vvvvvvvvvvvvvvvvvvvv
public extension JSONStringConvertible where Self:UnsignedInteger

扩展仅适用于无符号整数! Int 是无符号整数吗?不! Int 是有符号整数,而 UInt 是无符号整数。

所以只需将 Unsigned 更改为 Signed,然后在 IntInt64Int32 等上进行扩展。例如

extension Int: JSONStringConvertible, JSONSerializable {}
extension Int32: JSONStringConvertible, JSONSerializable {}
extension Int64: JSONStringConvertible, JSONSerializable {}

此外,您必须在 Self:UnsignedInteger 处添加其他协议扩展,因此您的所有协议扩展都将如下所示:

extension JSONSerializable where Self:SignedInteger, Self:JSONStringConvertible
{
    var jsonObject: JSONStringConvertible { return self }
}
extension JSONStringConvertible where Self:SignedInteger
{
    var jsonString: String { return "" }
}

extension JSONSerializable where Self:UnsignedInteger, Self:JSONStringConvertible
{
    var jsonObject: JSONStringConvertible { return self }
}
extension JSONStringConvertible where Self:UnsignedInteger
{
    var jsonString: String { return "" }
}