【问题标题】:Error Returning Array<Struct> as Array<Any>将 Array<Struct> 作为 Array<Any> 返回时出错
【发布时间】:2015-09-21 01:01:58
【问题描述】:

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

无法将类型“[S]”的返回表达式转换为返回类型“[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 { $0 }
}

我是否遗漏了数组或协议在 Swift 中的工作方式?转换 [S]() as! [P] 也允许函数返回,尽管我不确定为什么必须强制转换,因为 S 确实 符合 P

I've made a Playground with the issue

【问题讨论】:

    标签: arrays swift struct protocols


    【解决方案1】:

    这与 Brent Simmons 在this blog post 中讨论的问题相同。对此有一些有趣的讨论on Twitter;我会鼓励你通读对话。

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

    如果是空数组,可以直接return []

    【讨论】:

    • 在我的例子中,我有一个包含 3 个部分的 tableView,其中有 3 种类型的单元格,每种代表不同的数据类型。点击部分标题会使用该部分中的数据进行分析调用,所以在我的情况下,它从来都不是一个空列表。我想我会在这种情况下映射它们,或者找出某种功能组合来解决静态分析。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2020-09-22
    • 1970-01-01
    • 2019-03-30
    • 2022-12-17
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多