【问题标题】:Generic iteration between collections集合之间的通用迭代
【发布时间】:2017-04-09 13:52:28
【问题描述】:

所以我要么有一个字典或数组,而不是检查它们是否为空,然后使用它们自己的逻辑分别枚举它们,我试图找到一个通用解决方案,无论集合类型如何迭代其元素,比如得到他们的枚举器并只是做一个for(index,element) in enumerator,但不断被编译器大喊大叫。我尝试了各种方法但没有运气,我似乎无法将任何类型转换为已删除的AnyCollection<AnyObject> 我知道这个问题有点含糊,但这可能是因为我仍在努力解决问题围绕类型擦除和使用 Any(type) 包装器

编辑:请求添加尝试,但它无法编译,正如我所说的我在使用通用协议时遇到问题

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

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

for(index,element) in enumerator {

}

错误信息:

'? 中的结果值:' 表达式的类型不匹配 'EnumeratedSequence>' 和 'EnumeratedSequence>'

【问题讨论】:

  • 你能从失败的尝试中添加任何代码吗?
  • @user28434 已更新,编译错误是 Result values in '? :' 表达式的类型不匹配 'EnumeratedSequence>' 和 'EnumeratedSequence>'
  • 您这样做到底想达到什么目的?因为它们有不同的元素类型(AnyObject vs (key: String, value: AnyObject))——即使你让它工作,你也必须在你的循环中做一些混乱的类型转换才能对元素做任何有用的事情。跨度>

标签: swift generics collections type-erasure enumerator


【解决方案1】:

有两个问题:

  1. AnyCollection不能是nil

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

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

资源:AnyCollection API

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

    '? 中的结果值:' 表达式的类型不匹配

    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
    

要解决这两个问题,您应该使用:

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

【讨论】:

  • 感谢您的输入,但它不是我正在寻找的答案,如果 else 语句仍然将字典与数组的枚举逻辑分开,我希望它不在乎它是什么集合或枚举类型(如果可能的话)所以我只有一个 for 循环
  • 我不认为你可以在声明后更改变量的类型。
猜你喜欢
  • 2015-04-18
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多