2016-06-09 4 views
0

나는이 프로토콜Swift에서 배열을 확장하는 방법은 무엇입니까?

protocol JsonConvertable { 
    init?(_ underlyingValue: UnderlyingValue) 
} 

UnderlyingValueenum입니다 있습니다

enum UnderlyingValue { 
    case string(String) 
    case int(Int) 
    case double(Double) 
    case bool(Bool) 
    case array(Array<Dictionary<String, AnyObject>>) 
    case dictionary(Dictionary<String, AnyObject>) 

    init?(value: JsonConvertable) { 
     switch rawValue { 
     case let value as [String: AnyObject]: self = .dictionary(value) 
     case let value as Array<[String: AnyObject]>: self = .array(value) 
     case let value as Double: self = .double(value) 
     case let value as Int: self = .int(value) 
     case let value as Bool: self = .bool(value) 
     case let value as String: self = .string(value) 
     default: return nil 
     } 
    } 
} 

배열 확장이 나에게 오류 Cannot assign value of type 'Array<Dictionary<String, AnyObject>>' to type 'Array<_>'를주고있다 그러나

extension String: JsonConvertable { 
    init?(_ underlyingValue: UnderlyingValue) { 
     switch underlyingValue { 
     case .bool(let value): self = value 
     default: return nil 
    } 
} 

을 다음과 같이 나는 대부분의 유형을 확장 할 수 있습니다

extension Array: JsonConvertable { 
    init?(_ underlyingValue: UnderlyingValue) { 
     switch underlyingValue { 
     case .array(let value): self = value 
     default: return nil 
     } 
    } 
} 

내가 생각할 수있는 모든 것을 시도했지만 아무것도 작동하지 않습니다. JsonConvertable을 ArrayLiteralConvertable에 맞추려고했는데 init에서 제네릭을 사용해 보았지만 generics를 이해하기 시작했으며 실제로이 경우 AssociatedType과 같은 방식으로 어떻게 유용 할 지 모릅니다. 나는 요소를 수축 시키려고 노력했다. 나는 이것을 2 일 내내 일하도록 노력해 왔고, 내가하는 모든 일은 아무런 진전을 보이지 않는 것처럼 보인다. 내가 뭘 놓치고 있니?

답변

4

확장 메서드에서 Array 유형이 < _> 인 Array를 확장하고 _underlyingValue 유형이 배열 < [String : AnyObject]> 유형입니다. 나는 내 프로젝트에 다시 얻을 수 있습니다 일단이 기회를 줄 것이다

extension Array where Element:Dictionary<String, AnyObject>, Element:JsonConvertable { 
    init?(_underlyingValue : UnderlyingValue){ 
     switch _underlyingValue { 
     case .array(let value): 
      self = value 
     default: 
      return nil 
     } 
    } 
} 
+0

:

은이 방법을 시도하게한다. 나는 비슷한 것을 시도해 보았습니다. 프로토콜을 사용하여 Element를 constrict 할 수 있다는 오류 메시지를 받았으며 구체적인 형식이 아님을 기억합니다. –

+0

아래의 오류는 내선 번호 'type '요소'non-protocol type으로 제한 'Dictionary

관련 문제