gpt4 book ai didi

swift - Swift 3 中泛型协议(protocol)内部的泛型协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 15:44:41 27 4
gpt4 key购买 nike

我想在 Swift 中为 Tree 创建一个接口(interface)(协议(protocol))。这棵树将为 TreeNodes 使用接口(interface)(协议(protocol))。但是所有这些接口(interface)都应该是通用的。理想情况下,我想要这样的东西:

protocol TreeNodeInterface {
associatedtype T: ElementInterface

var value: T { get set }

// ... some other methods
}

protocol TreeInterface {
var rootNode: TreeNodeInterface<T>? { get }

func clean()

// .. some other methods
}

class Tree<T: ElementInterface>: TreeInterface {
var root: TreeNodeInterface<T>?

var rootNode: TreeNodeInterface<T>? {
get {
return root
}
}

func clean() {

}
}

因此,例如,我将拥有从 TreeInterface 继承的类 Tree,并且我可以使用任何类型(Int、String、CustomClass 等)初始化该树,以便每个节点都将该类型作为值。

我设法用面向对象编程做到了这一点,但不能用面向协议(protocol)编程做到这一点

Swift 不允许我这样做。有人可以帮我吗?谢谢

最佳答案

我认为您尝试对协议(protocol)做太多事情。这里最大的问题是,如果该协议(protocol)具有关联类型(或 self 要求),则您无法创建具有该协议(protocol)类型的变量。通过用泛型替换这些定义,我得到了这个:

protocol TreeNodeInterface {
associatedtype Element: ElementInterface

var value: Element { get set }

// ... some other methods
}

protocol TreeInterface {
associatedtype Node: TreeNodeInterface

var rootNode: Node? { get }

func clean()

// .. some other methods
}

class Tree<T: TreeNodeInterface>: TreeInterface {
typealias Node = T
var rootNode: T?

init() {}

func clean() {

}
}

这可以编译,但现在你必须弄清楚如何初始化它。下一步是创建一个符合 TreeNodeInterface 的类型:

struct TreeNode<T: ElementInterface>: TreeNodeInterface {
typealias Element = T
var value: T
}

这看起来与协议(protocol)惊人地相似,但没关系。现在让我们初始化 Tree:

// Assuming that Int conforms to ElementInterface
let tree = Tree<TreeNode<Int>>()

呸!那是很多工作,我认为其中大部分是不必要的。您真的需要 TreeNodeInterfaceTreeInterface 吗?我认为你没有。如果您改用具体类型,它可能看起来像这样:

struct TreeNode<T: ElementInterface> {
var value: T
}

class Tree<T: ElementInterface> {
var root: TreeNode<T>?

init() {}

func clean() {

}
}

let tree = Tree<Int>()

关于swift - Swift 3 中泛型协议(protocol)内部的泛型协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43287460/

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