- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
此代码生成 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
}
}
(原始代码已删除,因为不起作用)
关于swift - 如何在 Swift 中将 Self 用于方法返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800274/
我是一名优秀的程序员,十分优秀!