Swift 获取超类的克隆
以下是我的游乐场片段:Swift 获取超类的克隆,swift,clone,subclass,superclass,Swift,Clone,Subclass,Superclass,以下是我的游乐场片段: class Box { func clone() -> Box { return Box() // <- how to return superclass here? } } class VBox:Box { } let vb = VBox() let cBox = vb.clone() // now cBox is a Box, not a VBox 类框{ func clone()->Box{ return Box()//您的意思是s
class Box {
func clone() -> Box {
return Box() // <- how to return superclass here?
}
}
class VBox:Box { }
let vb = VBox()
let cBox = vb.clone() // now cBox is a Box, not a VBox
类框{
func clone()->Box{
return Box()//您的意思是subclass.Box是超类,这就是您要返回的
这与以下内容非常相似:
但是,这不是完全相同的问题,因为您处理的是类而不是协议,所以我们可以看一下这个示例。首先,正确的工具是init
,而不是clone
:
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {}
let vb = VBox("test")
let cBox = VBox(copy: vb)
您可以看到,这很好,因为VBox
没有添加任何附加属性。但是如果VBox
确实添加了附加属性,那么您将得到所有需要实现init
的正确错误
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {
let b: String
init(_ a: String, _ b: String) {
self.b = b
super.init(a)
}
convenience init(copy: VBox) {
self.init(copy.a, copy.b)
}
}
let vb = VBox("test", "this")
let cBox = VBox(copy: vb)
请注意,这如何防止您尝试将框
复制到VBox
(因为这不会初始化所有参数)。如果您希望这样做,则需要提供一个副本(框)
initializer。这是使用init
的好处。它为您跟踪所有规则。NSCopying
会让您犯错误并最终崩溃。您的意思是subclass.Box是超类,这就是您返回的
这与以下内容非常相似:
但是,这不是完全相同的问题,因为您处理的是类而不是协议,所以我们可以看一下这个示例。首先,正确的工具是init
,而不是clone
:
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {}
let vb = VBox("test")
let cBox = VBox(copy: vb)
您可以看到,这很好,因为VBox
没有添加任何附加属性。但是如果VBox
确实添加了附加属性,那么您将得到所有需要实现init
的正确错误
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {
let b: String
init(_ a: String, _ b: String) {
self.b = b
super.init(a)
}
convenience init(copy: VBox) {
self.init(copy.a, copy.b)
}
}
let vb = VBox("test", "this")
let cBox = VBox(copy: vb)
请注意,这如何防止您尝试将框
复制到VBox
(因为这不会初始化所有参数)。如果您希望这样做,则需要提供一个副本(框)
initializer。这是使用init
的好处。它为您跟踪所有规则。NSCopying
会让您犯错误并最终崩溃。您的意思是subclass.Box是超类,这就是您返回的
这与以下内容非常相似:
但是,这不是完全相同的问题,因为您处理的是类而不是协议,所以我们可以看一下这个示例。首先,正确的工具是init
,而不是clone
:
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {}
let vb = VBox("test")
let cBox = VBox(copy: vb)
您可以看到,这很好,因为VBox
没有添加任何附加属性。但是如果VBox
确实添加了附加属性,那么您将得到所有需要实现init
的正确错误
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {
let b: String
init(_ a: String, _ b: String) {
self.b = b
super.init(a)
}
convenience init(copy: VBox) {
self.init(copy.a, copy.b)
}
}
let vb = VBox("test", "this")
let cBox = VBox(copy: vb)
请注意,这如何防止您尝试将框
复制到VBox
(因为这不会初始化所有参数)。如果您希望这样做,则需要提供一个副本(框)
initializer。这是使用init
的好处。它为您跟踪所有规则。NSCopying
会让您犯错误并最终崩溃。您的意思是subclass.Box是超类,这就是您返回的
这与以下内容非常相似:
但是,这不是完全相同的问题,因为您处理的是类而不是协议,所以我们可以看一下这个示例。首先,正确的工具是init
,而不是clone
:
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {}
let vb = VBox("test")
let cBox = VBox(copy: vb)
您可以看到,这很好,因为VBox
没有添加任何附加属性。但是如果VBox
确实添加了附加属性,那么您将得到所有需要实现init
的正确错误
class Box {
let a: String
init(_ a: String) { self.a = a }
convenience init(copy: Box) { self.init(copy.a) }
}
class VBox:Box {
let b: String
init(_ a: String, _ b: String) {
self.b = b
super.init(a)
}
convenience init(copy: VBox) {
self.init(copy.a, copy.b)
}
}
let vb = VBox("test", "this")
let cBox = VBox(copy: vb)
请注意,这如何防止您尝试将框
复制到VBox
(因为这不会初始化所有参数)。如果您希望这样做,则需要提供一个副本(框)
initializer。这是使用init
的一件好事。它为您跟踪所有规则。NSCopying
会让您犯错误,最终会崩溃。VBox是Box的一个子类,而不是超类。–这可能是您正在寻找的:得了流感吗?我的大脑仍然感觉模糊。您是对的o看起来我需要让他们使用NSObject并使用NSCopying?-Ehrm.你在运行中更改了链接?“Ehrm.你在运行中更改了链接”–是的。NSCopying
不是实现这一点的正确工具。它是不安全的,因为它必须通过AnyObject
NSCopying
只能用于与Cocoa交互。正确的工具是实现init(复制:)
.VBox是Box的一个子类,而不是超类。-这可能是你在寻找的:得了流感,我的大脑仍然感觉模糊。你是对的。所以看起来我需要让它们成为NSObject并使用NSCopying?-Ehrm。你动态地更改了链接?“Ehrm。你动态地更改了链接”–是的。NSCopying
不是实现这一点的正确工具。它是不安全的,因为它必须通过AnyObject
NSCopying
只能用于与Cocoa交互。正确的工具是实现init(复制:)
.VBox是Box的一个子类,而不是超类。-这可能是你在寻找的:得了流感,我的大脑仍然感觉模糊。你是对的。所以看起来我需要让它们成为NSObject并使用NSCopying?-Ehrm。你动态地更改了链接?“Ehrm。你动态地更改了链接”–是的。NSCopying
不是实现这一点的正确工具。它是不安全的,因为它必须通过AnyObject
NSCopying
只能用于与Cocoa交互。正确的工具是实现init(复制:)
.VBox是Box的一个子类,而不是超类。-这可能就是你要找的:得了流感,我的大脑仍然感觉模糊。你是对的。所以