将数组<struct>作为数组<any>

时间:2015-09-21 01:01:59

标签: arrays swift struct protocols

我有一个函数可以返回几个不同的类型,具体取决于我的数据结构的内部条件,所以我返回一个Any的数组并留下一个注释来解释它可能的类型。 (我确定这是一个更好的解决方案,但我不知道它是什么)。这给了我错误

  

无法转换类型&#39; [S]&#39;的返回表达式返回类型&#39; [Any]&#39;

其中S是纯Swift结构。我把它归结为一个例子来说明这个问题:

protocol P { }  // protocol
struct S: P { } // struct conforming to protocol

// Will Compile: all protocols implicitly conform to Any
func returnAny() -> Any {
    return S()
}

// refuses to compile with above error
func returnArrayOfAny() -> [Any] {
    return [S]()
}

// oddly enough, this will compile and work
func returnMappedArrayOfAny() -> [Any] {
    return [S]().map { $0 }
}

我是否错过了Arrays或Protocols在Swift中工作的方式?转换[S]() as! [P]也允许函数返回,但我不确定为什么必须强制转换,因为S 符合P

I've made a Playground with the issue

1 个答案:

答案 0 :(得分:3)

这是布伦特西蒙斯在this blog post中讨论的同一问题。有一些有趣的讨论on Twitter;我鼓励你仔细阅读对话。

重点是[S][Any]可能具有根本不同的存储/布局,因此它们之间的转换非常重要(不一定能在恒定时间内完成)。 map是一种方便的方法,可以明确表示您正在构建一个新数组。

如果是空数组,您只需return []