gpt4 book ai didi

arrays - 如何检查 `Any` 类型的对象是一个实现某些协议(protocol)的具体类的数组

转载 作者:搜寻专家 更新时间:2023-10-30 22:13:39 25 4
gpt4 key购买 nike

我遇到了一个问题。假设我有一个协议(protocol)和两个实现它的类:

protocol Initiatable{
init()
}

class A: Initiatable{
required init() {}
}

class B: Initiatable{
required init() {}
}

然后在某个时候我正在创建一个数组并将其传递给函数:

var array = [A]()

func update(object: Any){

}

update(object: array)

从那个函数 update 我想将 object 传递给另一个函数,如果它满足另一个函数的条件:

func process<T: Initiatable>(array: T){
/* ... */
}

那么我如何检查Any 类型的对象是一个实现Initiatable 协议(protocol)的具体类的数组?我想写类似的东西

func update(object: Any){
if let array = object as Array<T: Initiatable>{
process(array: array)
}
}

但那是行不通的。代码如下:

func update(object: Any){
if let array = object as [Initiatable]{
process(array: array)
}
}

func process(array: [Initiatable]){ }

编译很好,但这不是我想要的——process 函数应该接收一个 Initiatable 的具体实现数组,所以在某些时候它可以使用:

func process<T: Initiatable>(array: [T]){
/* other code */
T.init()
}

那么有没有办法做到这一点呢?非常感谢您!

最佳答案

这个问题有几个部分:

生成类型数组

您的数组声明需要一个 A 对象 数组,而不是 A 类型。要生成具有 A 类型的数组,您可以传入一个 Postfix self 表达式:( link )

var array = [ A.self ]

这会将 array 定义为 A.Type 的数组,称为元类型类型 (same link)。

您还可以使用此元类型生成一个空数组:

var array:[A.Type] = []

如果您想要一个同时包含 A.selfB.self 的数组,您可以将其指定为 [Any]...

var array:[Any] = [A.self,B.self]

...或者,使用您创建的 Initiatable 协议(protocol):

var array:[Initiatable.Type] = [A.self,B.self]

在更新方法中将数组向下转换为类型数组

您在将 Any 对象向下转换为类型数组时遇到了问题。这是我更新的 update 方法:

func update(object: Any){
if let array = object as? [Initiatable.Type] { //1
process(array: array)
}
}
  1. 您现在可以对传递给您的update 方法的数组执行可选的向下转换。将其向下转换为 Initiatable 的元数据类型数组:(这是我从您的方法中修改的唯一一行)

在处理方法中接收类型作为参数

我假设您只希望您的处理方法接收一组类型,并根据其中一种类型实例化一个变量。您没有提到数组中的哪个元素,所以我只说了第一个。

func process(array: [Initiatable.Type]){    //1
if let firstType = array.first { //2
let firstObject = firstType.init() //3
}
}
  1. process方法可以接收采用Initiatable协议(protocol)的类型数组。
  2. 我正在使用可选绑定(bind)来获取数组中第一个元素的值。这应该是一个类型。
  3. 根据数组中的第一个元素实例化一个对象。

关于arrays - 如何检查 `Any` 类型的对象是一个实现某些协议(protocol)的具体类的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43501366/

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