gpt4 book ai didi

swift - 无法将类型 'NodeType.NodeType?' 的返回表达式转换为返回类型 'NodeType?'

转载 作者:搜寻专家 更新时间:2023-11-01 05:33:23 26 4
gpt4 key购买 nike

我在 Swift 中处理这个问题有一段时间了,尝试了类型删除和各种东西,但都无济于事;这个问题似乎是常识(至少对我而言)。如何在 Swift 中模拟抽象类?换句话说,如何使这项工作:

import Foundation

protocol NodeProtocol
{
associatedtype NodeType
func getNode() -> NodeType
}

class Node: NodeProtocol
{
typealias NodeType = Node
var next:Node = Node()
func getNode() -> Node {
return next
}
}

class AbstractGraph<NodeType:NodeProtocol>
{
var root: NodeType?
func getRoot () -> NodeType?{
return root?.getNode()
}
}

注意:这只是我写的一些随机代码,只是为了触及问题的核心。

最佳答案

我不确定我是否正确理解了你的问题(你实际上问了一对夫妇)但这是我在 Swift (4) 中“模拟”抽象类的方式:

protocol Node {
func getNext() -> Node
}

extension Node {

func getNext() -> Node {
fatalError("getNext is not implemented!")
}

}


struct StringNode: Node {
var data: String!
}

let sNode = StringNode(data: "test-node-1")

sNode.getNext()

使用协议(protocol)扩展,我决定需要使用 fatalError() 调用来实现哪些功能。

现在 Node 的每个 Node 后代必须实现 getNext() 否则我们会崩溃。在 playground 中运行上面的代码,你会看到它会在最后一行崩溃,迫使你实现 getNext()。

“修复”将是:

protocol Node {
func getNext() -> Node
}

extension Node {

func getNext() -> Node {
fatalError("getNext is not implemented!")
}

}


struct StringNode: Node {
var data: String!

func getNext() -> Node {
return StringNode(data: "test-node-2")
}
}

let sNode = StringNode(data: "test-node-1")

sNode.getNext()

现在它不会在最后一行崩溃。全部使用 Xcode 9 和 Swift 4 在 Playground 上进行了测试。

注意:这当然不是此 Node 协议(protocol)的最佳实现。该协议(protocol)应该列出可操作的方法,这些方法应该表示一个名为 NodeOperatableNode。应创建一个名为 Node 的类来实现此 NodeOperatable 而不是实现 getNext() 这将强制后代类实现 getNext ()

关于swift - 无法将类型 'NodeType.NodeType?' 的返回表达式转换为返回类型 'NodeType?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48883965/

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