Home > Back-end >  Append a dictionary array to another dictionary array in Swift
Append a dictionary array to another dictionary array in Swift

Time:03-02

I have two quote dictionaries I'm trying to append after an in-app purchase. I have tried several different methods to append the dictionaries together but I'm still getting an error "No exact matches in call to instance method 'append'"

I have established variables for each array to then append the array within the struct.

Any thoughts? Is there a better method I should use to add the quotes from the array called QuoteDetails2 to the initial array QuoteDetails?

var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()

public struct QuoteProvider {
    static func all() -> [QuoteDetails] {
        [
            QuoteDetails(
                id: "1",
                texts: "High school is fun",
                authors:  "SM"
            ),
            QuoteDetails(
                id: "2",
                texts: "Middle School is fun",
                authors:  "A. Philip Randolph"
            ),
            QuoteDetails(
                id: "3",
                texts: "The playground is fun",
                authors:  "Booker T. Washington"
            ),
            QuoteDetails(
                id: "4",
                texts: "Hold on to your dreams of a better life and stay committed to striving to realize it.",
                authors:  "KJ"
            )
        ]
    }
    static func all2() -> [QuoteDetails2] {
        [ 
            QuoteDetails2(
                id: "1",
                texts: "The cat ran fast",
                authors: " ME"
            ),
            QuoteDetails2(
                id: "2",
                texts: "The dog ran fast.",
                authors: " ME"           
            ),
            QuoteDetails2(
                id: "3",
                texts: "End life problems",
                authors: "ME"           
            )                
        ]
    }
    func showPremiumQuotes() {
        if UserDefaults.standard.bool(forKey: "premiumQuotes") == true {
            topQuotes.append(contentsOf: additionalQuotes)
        }
    }
    /// - Returns: A random  item.
    static func random() -> QuoteDetails {
          let allQuotes = QuoteProvider.all()
          let randomIndex = Int.random(in: 0..<allQuotes.count)
          return allQuotes[randomIndex]
    }
}

CodePudding user response:

This should be a comment but it would be a bit tricky to explain what Koropok & Leo Dabus were saying without the formatting.

You have two arrays:

var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()

When you try to do this line topQuotes.append(contentsOf: additionalQuotes), the compiler gives you the error because topQuotes is expecting a type QuoteDetails to be stored in it where as additionalQuotes says it is storing QuoteDetails2 so it is unable to append a different type to topQuotes.

Just because they have the exact same properties, the compiler cannot tell they are the same because they are named differently. It is kind of doing something like this:

var topQuotes = [Int]()
var additionalQuotes = [String]()
topQuotes.append(contentsOf: additionalQuotes)

A quick fix to get this to work is to say topQuotes can store Any type, like this

var topQuotes = [Any]()

But I recommend against this, just showing you your options and if you are new, I would stay away from this for now.

Based off of this and your QuoteProvider struct, it seems you have 2 structs which are identical:

struct QuoteDetails
{
    var id: String
    var texts: String
    var authors: String
}

struct QuoteDetails2
{
    var id: String
    var texts: String
    var authors: String
}

What is the difference between QuoteDetails and QuoteDetails2 ? If nothing, then you can get rid of QuoteDetails2 and change

var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()

to

var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails]()

Once you define a type, you can reuse that type multiple times.

After you make the above change, I believe the errors should go away.

CodePudding user response:

you can have both QuoteDetails and QuoteDetails2 in same array if it's Any

var topQuotes = [Any]()
topQuotes.append(contentsOf: additionalQuotes)

To different QuoteDetails from QuoteDetails2 in Array of Any

for quote in topQuotes {
    if let normalQuote = quote as? QuoteDetails {
        // do something with QuoteDetails
    } else if let premiumQuote = quote as? QuoteDetails2 {
        // do something with QuoteDetails2
    }
}

you doesn't append a dictionary array to another dictionary array, but you are appending to array with different type

  • Related