Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
595 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 Reply

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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...