集合之间的通用迭代

时间:2016-11-25 08:07:45

标签: swift generics collections type-erasure enumerator

所以我要么有一个字典或数组,而不是检查任何一个的null,然后使用他们自己的逻辑分别枚举它我试图找到一个通用的解决方案,无论集合类型如何遍历其元素,类似于得到他们的枚举器,只是做一个for(index,element) in enumerator,但继续被编译器大吼大叫。我已经尝试了各种各样的方法而且没有运气,我似乎无法投入到被删除的类型AnyCollection<AnyObject>我知道这个问题有点模糊,但那可能是因为我还在尝试换行我的头围绕类型擦除并使用Any(类型)包装器

编辑:请求添加尝试,但它没有编译,因为我说我遇到了通用协议的问题

var a = AnyCollection(array!)
var d = AnyCollection(dictionary!)

let enumerator = a == nil ? d.enumerated(): a.enumerated()//compile error

for(index,element) in enumerator {

}

错误消息:

  

''中的结果值? :'表达式具有不匹配的类型'EnumeratedSequence&lt; AnyCollection&lt;(key:String,value:AnyObject)&gt;&gt;'和'EnumeratedSequence&lt; AnyCollection&lt; AnyObject&gt;&gt;'

1 个答案:

答案 0 :(得分:0)

有两个问题:

  1. AnyCollection不能是nil

    var a = AnyCollection(array!)
    let a = nil -> Nil cannot be assigned to type 'AnyCollection<AnyObject>'
    

    这是一个简单的解决方法。 a.first可以是nil

  2. 资源:AnyCollection API

    1. 您正在使用short if语句,但类型不同。您正在尝试将不同类型分配给同一个变量,并且不允许这样,因此出现错误消息:

        

      &#39;中的结果值:&#39;表达式有不匹配的类型

      let array = [AnyObject]()
      let dictionary = [String : Any]()
      
      var a = AnyCollection(array)
      var d = AnyCollection(dictionary)
      
      let enumerator = a.first == nil ? d.enumerated() : a.enumerated() -> compile error
      let enumerator = a.first == nil ? a.enumerated() : a.enumerated() -> works but useless
      
    2. 要解决这两个问题,您应该使用:

      if a.first == nil {
          let enumOne = d.enumerated()
      } else {
          let enumOne = a.enumerated()
      }