gpt4 book ai didi

swift - 如何在 Swift 中将 Self 用于方法返回类型?

转载 作者:可可西里 更新时间:2023-11-01 00:39:13 25 4
gpt4 key购买 nike

此代码生成 Xcode 错误消息,使您陷入困境。假设我有一个名为 Marker 的协议(protocol),我希望 Markers 能够 self 复制。这是第一个猜测...

protocol Marker {
func copy() -> Self
}
class Marker1 : Marker {
func copy() -> Self {
return Marker1() // error here
}
}

(我不确定如何正确使用 Self,因为我在 The Swift Programming Language 文档中找不到它。如果您知道它的记录位置,请在回答中包括在内。)

该代码在标记行上给出了一个错误:无法将类型“Marker1”的返回表达式转换为返回类型“Self”,它建议修复:Insert ' as! self '

我接受修复:

...
return Marker1() as! Self
...

这会导致另一个编译器错误:'Self' 仅在协议(protocol)中可用或作为类中方法的结果可用;您是说“Marker1”吗?

如果我接受“修复”,它会回到原来的错误。我将其称为 Xcode 中的错误。让我们试试别的:

func copy() -> Marker1 {
return Marker1()
}

另一个错误:非最终类“Marker1”中的方法“copy()”必须返回“Self”以符合协议(protocol)“Marker”

使类 final 确实修复了错误。但是有没有办法在不让类(class)结束的情况下做到这一点? Self 记录在哪里?

最佳答案

使用这样的层次结构,您必须使类符合协议(protocol) final:

protocol Marker {
func copy() -> Self
}
final class Marker1 : Marker {
func copy() -> Marker1 {
return Marker1()
}
}

final 是必需的,因为当您不应用 final 并创建子类 Marker2: Marker1 时,复制将不会返回不再正确的类 Self

您可以通过创建一个 required 初始化器来解决这个问题,并始终创建正确的实例:

protocol Marker {
init()
func copy() -> Self
}
class Marker1 : Marker {
required init() {
}
func copy() -> Self {
let copy = type(of: self).init()
return copy
}
}

(原始代码已删除,因为不起作用)

相关:Implementing copy() in Swift

关于swift - 如何在 Swift 中将 Self 用于方法返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800274/

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