簡體   English   中英

如何在Swift中擴展數組?

[英]How to extend an array in Swift?

我有這個協議

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

UnderlyingValue是一個enum

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一樣。 我試圖收縮元素。 我一直在努力使其工作整整2天,而我所做的一切似乎都沒有取得任何進展。 我想念什么?

在擴展方法中,您正在擴展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
      }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM