2016-06-09 66 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 '' –