将 Array<Struct> 作为 Array<Any> 返回时出错
Error Returning Array<Struct> as Array<Any>
我有一个函数可以 return 几种不同的类型,这取决于我的数据结构的内部条件,所以我 return 一个 Any 数组并留下评论解释它可能是的类型. (我确定有更好的解决方案,但我不知道它是什么)。那给了我错误
Cannot convert return expression of type '[S]' to return type '[Any]'
其中 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 { [=12=] }
}
我是否遗漏了数组或协议在 Swift 中的工作方式?转换 [S]() as! [P]
也允许函数 return,虽然我不确定为什么必须强制转换,因为 S
确实 符合P
.
这与 Brent Simmons 在 this blog post. There is some interesting discussion on Twitter 中讨论的问题相同;我鼓励您通读对话。
要点是 [S]
和 [Any]
可能有根本不同的 storage/layout,因此它们之间的转换很重要(不一定在恒定时间内完成)。 map
是一种解决此问题的简便方法,可以明确表示您正在构建一个新数组。
在空数组的情况下,可以简单的return []
.
我有一个函数可以 return 几种不同的类型,这取决于我的数据结构的内部条件,所以我 return 一个 Any 数组并留下评论解释它可能是的类型. (我确定有更好的解决方案,但我不知道它是什么)。那给了我错误
Cannot convert return expression of type '[S]' to return type '[Any]'
其中 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 { [=12=] }
}
我是否遗漏了数组或协议在 Swift 中的工作方式?转换 [S]() as! [P]
也允许函数 return,虽然我不确定为什么必须强制转换,因为 S
确实 符合P
.
这与 Brent Simmons 在 this blog post. There is some interesting discussion on Twitter 中讨论的问题相同;我鼓励您通读对话。
要点是 [S]
和 [Any]
可能有根本不同的 storage/layout,因此它们之间的转换很重要(不一定在恒定时间内完成)。 map
是一种解决此问题的简便方法,可以明确表示您正在构建一个新数组。
在空数组的情况下,可以简单的return []
.