gpt4 book ai didi

swift - 快速将父实例传递给子类型变量

转载 作者:搜寻专家 更新时间:2023-10-31 22:13:18 25 4
gpt4 key购买 nike

我想将一个父类的实例传递给一个类型是该父类的子类的变量。

有两个类如下:

class Parent{
var aaa:String?
var bbb:String?
init(pa:String?,pb:String?){
self.aaa=pa
self.bbb=pb
}
}

class Child:Parent{
var ccc:String?
}

现在,我这样使用它们:

let p=Parent(a:"1111",b:"22222")
if let c=p as? Child{
print(c)
}

但变量在任何情况下都是 nil。

我想得到如下结果:c.aaa="1111"c.bbb="222"c.ccc=nil 或其他

最佳答案

首先让我们清理你的代码

class Parent {
var a:String?
var b:String?
init(a:String?, b:String?) {
self.a = a
self.b = b
}
}

class Child: Parent{
var c: String?
}

回答

使用这段代码,您可以创建一个 Parent 对象并将其放入 parent 常量中。

let parent = Parent(a:"1111",b:"22222")

然后您尝试将 parent 转换为 Child。但是 Parent NOT Child。所以转换会失败。

if let child = parent as? Child {
print(child)
}

结论

class Child: Parent { ...}

你是说 Child 也是 Parent

不是 ParentChild

更新

如果你想使用 Parent 对象创建一个 Child 对象(如果这对你的业务逻辑有意义的话)这里是代码

class Child: Parent{
var c: String?

init(parent:Parent, c:String) {
super.init(a: parent.a, b: parent.b)
self.c = c
}
}

let parent = Parent(a: "a", b: "b")
let child = Child(parent: parent, c: "c")
child.a // "a"
child.b // "b"
child.c // "c"

has-a 而不是 is-a

另一种可能的解决方案是避免子类化,这是代码

struct Parent {
var a:String?
var b:String?
}

struct Child {
var c: String?
var parent: Parent
}

现在 Child 不是 Parent 但包含一个 Parent

You probably should rename them

现在有了 parent

let parent = Parent(a: "a", b: "b")

你可以很容易地创建一个 child

let child = Child(c: "c", parent: parent)

这就是你使用 child 的方式

child.parent.a // "a"
child.parent.b // "b"
child.c // "c"

关于swift - 快速将父实例传递给子类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38994593/

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