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

时间:2017-05-18 06:12:46

标签: swift swift-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 ) }
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

看看你在这里写的内容:

//                                           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 "" }
}