2017-05-18 2 views
0

두 프로토콜 (JSONStringConvertibleJSONSerializable)이 있습니다. Int, Int64, UInt32 등이 모두이 프로토콜을 따르길 원합니다. 해당 프로토콜의 확장을 통해 프로토콜 준수를`UnsignedInteger`에 추가 할 수 있습니까?

는이 코드
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) } 
} 

: 나는이 작업을 수행해야? 여기에 무엇을 쓸에서

+0

당신은 각각'UnsignedInteger'에 대해 개별적으로 적합성을 추가해야합니다 :

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

또한, Self:UnsignedInteger, 그래서 모든 프로토콜 확장은 다음과 같이됩니다 다른 프로토콜 확장을 추가해야합니다 관심이 있으신 분 – Alexander

답변

1

봐는 :

//           vvvvvvvvvvvvvvvvvvvv 
public extension JSONStringConvertible where Self:UnsignedInteger 

확장은 부호없는 정수 적용! Int은 부호없는 정수입니까? 아니! Int은 부호있는 정수이고 UInt은 부호 없음입니다.

그래서 그냥 IntInt64를 확장을 다음 Signed-Unsigned을 변경하고, Int32 등 예를 들어,

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 "" } 
} 
+0

고마워요. 내 코드는 실제로 당신이 작성한대로 확장 기능을 가지고 있습니다 - 나는 단지 모든 것을 게시하지 않았습니다 ... 제 질문을 수정했습니다. – nielsbot

+0

SignedInt/UnsignedInt에 대한 초기 부분은 제거 할 수 있지만 정답입니다. 감사! – nielsbot