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的一个子类,而不是超类。-这可能就是你要找的:得了流感,我的大脑仍然感觉模糊。你是对的。所以