2016-06-09 17 views
0

Ich habe dieses ProtokollWie erweitert man ein Array in Swift?

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

UnderlyingValue ein enum ist:

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

Ich kann die meisten Arten erstrecken, wie

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

folgt jedoch wird die Array-Erweiterung mir den Fehler geben Cannot assign value of type 'Array<Dictionary<String, AnyObject>>' to type 'Array<_>'

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

Ich habe alles versucht, woran ich denken kann, aber nichts funktioniert. Ich habe versucht, JsonConvertable konform zu ArrayLiteralConvertable zu haben, ich habe versucht, Generics in der Init zu verwenden, aber ich beginne gerade, Generics zu verstehen und weiß nicht wirklich, wie es in diesem Fall, das mit AssociatedType vorteilhaft wäre. Ich habe versucht, Element zu verengen. Ich habe versucht, dies 2 Tage lang zur Arbeit zu bringen, und alles, was ich tue, scheint keine Fortschritte zu machen. Was vermisse ich?

Antwort

4

In Ihrer Erweiterungsmethode erweitern Sie Array, das eine Art Array < _> ist, und Ihr _underlingingValue ist Array-Typ < [String: AnyObject]>.

Haben Sie auf diese Weise versuchen:

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

ich diese eine Chance geben wird, wenn ich wieder in mein Projekt zu bekommen. Ich habe etwas ähnliches versucht, ich erinnere mich an eine Fehlermeldung, dass Sie Element nur mit einem Protokoll und nicht mit einem konkreten Typ einschränken können. –

+0

Der untenstehende Fehler tritt bei der Erweiterungssignatur auf 'Typ 'Element' beschränkt auf Nicht-Protokolltyp 'Dictionary ' –

Verwandte Themen