Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
589 views
in Technique[技术] by (71.8m points)

ios - Merge Swift Array with same superclass

I'm trying to find the best way to merge Swift arrays, that are not of same type, but they have same superclass. I've already read all the tutorials so I know I can use:

var array = ["Some", "Array", "of", "Strings"]
array += ["Another string", "and one more"]
array.append(["Or", "This"])

In this case array variable infers the type [String]. The problem I have relates to the next hypothetical situation with classes (properties do not matter in this case, just there to make a difference between classes):

class A {
    var property1 : String?
}

class B : A {
    var property2: String?
}

class C : A {
    var property3: String?
}

So I create an array of class A and B objects:

var array = [ A(), B(), A(), B() ]

This array should now be of type [A], since this is the inferred type by both A and B classes.

Now I want to append objects to this array, that are of type C.

var anotherArray = [ C(), C(), C() ]

Since anotherArray is now of type [C], we should still be able to append it, since all C instances respond to A methods. So we try:

array += anotherArray

This fails due to:

Binary operator '+=' cannot be applied to operands of type '[A]' and '[C]'.

Similar story with using append method. While this does make sense, I cannot understand why this couldn't work.

Can someone explain why this is not working? What is the best solution to this problem?

The only sensible solution I found is to define the type of anotherArray to be [A], but are there any better ones or this is correct?

var anotherArray : [A] = [ C(), C(), C() ]

Thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

If C inherits from A then you can "upcast" an array of type [C] to an array of type [A]

array += anotherArray as [A]

Alternatively, use (tested with Swift 4)

array.append(contentsOf: anotherArray)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...