gpt4 book ai didi

ios - 如何将类型化数组转换为其中一种类型协议(protocol)?

转载 作者:行者123 更新时间:2023-11-29 01:52:32 26 4
gpt4 key购买 nike

我的 Playground 上有这个:

func foo(printables: [Printable]) {
// do something
}

enum MenuOptions: String, Printable {
case ChangePickup = "Change Pickup Time"
case RequestSupport = "Request Support"

var description: String {
get {
return self.rawValue
}
}
}
var menuOptions: [MenuOptions] = [.ChangePickup]
foo(menuOptions)
let printables = menuOptions as [Printable]

最后两行给出编译器错误。我希望 menuOptions 被隐式转换为 [Printable] 但编译器提示 [MenuOptions] is not convertible to [Printable] 错误.我错过了什么吗?

如果我做 menuOptions as!任何对象作为! [Printable] 编译器没有报错并且代码工作正常,但这看起来很脏。有趣的是,执行 foo(menuOptions.map { $0 }) 也可以!这只是一个编译器错误吗?

最佳答案

您正在尝试创建一个通用函数,该函数受限于符合 Printable 的对象。协议(protocol)。只是定义不同:

func foo<T: Printable>(printables: [T]) {
// do something
}

该函数现在将在您的上下文中运行。它将采用符合 Printable 的任何对象类型的数组。 .

这里是Generics上的相关文档, 具体来说 Type Constraints .

至于为什么这有效,但您的定义不起作用 - 这只是 Swift 语法。 Printable是一个协议(protocol),但是 T是一种类型(通用,但仍然是一种类型)。您希望您的函数接受符合协议(protocol) ( T ) 的任何类型 ( <T: Protocol> )。这就是语言的设计方式。

使用 menuOptions as! AnyObject as! [Printable]可能在这个例子中有效,但这是一种不好的做法。使用 as!就像告诉编译器“相信我,这会起作用”。这在有限的情况下很好,但从长远来看会给你带来麻烦。使用 as!关闭编译器的类型检查,这意味着如果出现问题,它将在运行时发生,并且您的应用程序将崩溃。

再次,我强烈建议阅读我在上面链接的有关类型约束的文档。它详细解释了它。

关于ios - 如何将类型化数组转换为其中一种类型协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com