在swift

时间:2016-08-17 10:50:48

标签: swift

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

有两个课程如下:

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或其他

2 个答案:

答案 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

ParentChild

更新

如果您想使用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)