2016-06-09 43 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 
     } 
    } 
} 

我可以如下

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

然而阵列扩展给我错误 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 
     } 
    } 
} 

我已经尝试了所有我能想到但没有任何工作。我试图让JsonConvertable符合ArrayLiteralConvertable,我曾尝试在init中使用泛型,但我只是开始理解泛型,并不真正知道在这种情况下它将如何有益,与AssociatedType相同。我试图收缩Element。我一直试图让这个工作整整两天,我所做的一切似乎都没有取得任何进展。我错过了什么?

回答

4

在您的扩展方法中,您正在扩展Array,它是一种Array < _>,您的_underlyingValue是Array < [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。 –

+0

下面的错误显示在扩展签名 '类型'元素'被约束为非协议类型'Dictionary '' –