gpt4 book ai didi

ios - 如何重写 iOS 纯 swift 拷贝构造函数

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

一个非常简单的 iOS Swift 继承示例,带有复制构造函数。当我尝试编译它时,Xcode 提示说我覆盖了一个用参数类型 Base 定义的函数,而在 child 中它是 Child。

我同意编译器的类型不同,但他仍然应该让我以某种方式在不使用不同函数名称的情况下这样做...

import Foundation
import SpriteKit

class Base : SKSpriteNode
{
private var a : Int = 0

init(other: Base)
{
self.a = other.a
super.init(fileNamed: "test")
}

required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
}

class Child : Base
{
private var b : Int = 0

init(other: Child)
{
self.b = other.b
super.init(other: other)
}

required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
}

请问有没有办法在 Xcode 6 和 Swift 中做到这一点?干杯,传统知识

编辑:不幸的是,我写的问题很容易被误解。所以它真的只是关于复制构造函数,没有别的。将代码从简单的伪代码调整为由于上述问题而无法编译的实际代码。

最佳答案

作为基类,Base 不需要从父类(super class)调用指定的初始化器,因为它没有。删除它,一切都会好起来的。

此外,我相信您在子类初始化程序中对 super 的调用应该在分配本地 iVar 之后进行。

class Base
{
private var a : Int = 0

init(other: Base)
{
self.a = other.a
}
}

class Child : Base
{
private var b : Int = 0

init(other: Child)
{
self.b = other.b
super.init(other: other)
}
}

由于问题的重新表述而编辑:

您的“基”类现在必须从父类(super class)中调用指定的初始化程序。在这种情况下,init(texture: SKTexture!, color: UIColor!, size: CGSize)

在您的“Child”类中,您可以检查 other 是否属于 Child 类型,如果是,则进行适当的转换。

override init(other: Base)
{
if other is Child {
self.b = (other as! Child).b
}
super.init(other: other)
}

另请参阅 How to implement copy constructor in Swift subclass? 中的最佳答案寻求进一步的帮助。

关于ios - 如何重写 iOS 纯 swift 拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705237/

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