我想将父类的实例传递给一个类型为该父类的子类的变量。
有两个课程如下:
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)
}
但是在任何情况下变量都是零。
我想得到如下结果:c.aaa="1111" c.bbb="222" c.ccc=nil
或其他
答案 0 :(得分:4)
首先让我们清理您的代码
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")
然后您尝试将父级转换为Child。但Parent
不 a Child
。演员阵容将失败。
if let child = parent as? Child {
print(child)
}
class Child: Parent { ...}
您说Child
也是Parent
。
不 Parent
是Child
。
如果您想使用Child
对象创建Parent
对象(如果这对您的业务逻辑有意义),请参阅以下代码
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
您可能应该重命名
现在给父母
let parent = Parent(a: "a", b: "b")
您可以轻松创建儿童
let child = Child(c: "c", parent: parent)
这就是你如何使用孩子
child.parent.a // "a"
child.parent.b // "b"
child.c // "c"
答案 1 :(得分:1)
回答您问题的评论将告诉您为什么您的条件演员将始终失败。要打印 c 的值作为儿童的实例,以下内容应该有效:
class Parent {
var aaa:String?
var bbb:String?
init(aaa: String?, bbb: String?) {
self.aaa = aaa
self.bbb = bbb
}
}
class Child : Parent {
var ccc:String?
}
var child = Child(aaa: "", bbb: "")
print(child)