gpt4 book ai didi

swift - 数组中的协议(protocol)和关联类型

转载 作者:可可西里 更新时间:2023-11-01 00:54:18 24 4
gpt4 key购买 nike

我有一个协议(protocol) Node :

protocol Node {
var parent: Node?
var children: [Node]
}

由类实现:

class TreeNode: Node {
var parent: Node?
var children: [Node]
}

但这会带来一个问题,因为在 TreeNode 中访问父级现在给我一个Node ,我想做 TreeNode对他们的具体操作。所以我想将协议(protocol)更改为:

protocol Node {
associatedtype T: Node

var parent: T?
var children: [T]
}

我将类定义为:

class TreeNode: Node {
var parent: TreeNode?
var children: [TreeNode]
}

太棒了!但有一个陷阱。如果我想为 Node 编写辅助方法处理数组:

func getReversedChildren<T: Node>(node: T) -> [T] {
return node.children.reversed()
}

编译器失败并出现错误: Cannot convert return expression of type 'ReversedCollection<[T.T]>' to return type '[T]'

根据我对这个问题的了解,我需要实现一个类型删除机制来支持这个架构。但是如何在我的例子中做到这一点?

最佳答案

您可能希望节点的父节点和子节点与节点本身具有相同类型,而不仅仅是一些符合节点的类型。这将是协议(protocol)定义中的 Self:

protocol Node {
var parent: Self? { get set }
var children: [Self] { get set }
}

现在您可以定义具体类(参见 A Swift protocol requirement that can only be satisfied by using a final class 了解为什么该类需要final):

final class TreeNode: Node {
var parent: TreeNode? = nil
var children: [TreeNode] = []
}

func getReversedChildren<T: Node>(node: T) -> [T] {
return node.children.reversed()
}

编译没有问题。

关于swift - 数组中的协议(protocol)和关联类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54267521/

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