将字典数组附加到 Swift 中的另一个字典数组

Append a dictionary array to another dictionary array in Swift

我有两个报价词典,我想在应用程序内购买后追加。我尝试了几种不同的方法将字典附加在一起,但我仍然收到错误消息“在调用实例方法 'append' 时没有完全匹配”

我已经为每个数组建立了变量,然后将数组附加到结构中。

有什么想法吗?我应该使用更好的方法将名为 QuoteDetails2 的数组中的引号添加到初始数组 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]
    }
}

这应该是一条评论,但如果没有格式化,解释 Koropok 和 Leo Dabus 所说的话会有点棘手。

你有两个数组:

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

当您尝试执行此行 topQuotes.append(contentsOf: additionalQuotes) 时,编译器会给出错误,因为 topQuotes 期望类型 QuoteDetails 存储在其中 additionalQuotes 说它正在存储 QuoteDetails2 所以它无法将不同的类型附加到 topQuotes.

仅仅因为它们具有完全相同的属性,编译器无法判断它们是否相同,因为它们的命名不同。它有点像这样:

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

让这个工作的快速修复是说 topQuotes 可以存储 Any 类型,就像这样

var topQuotes = [Any]()

但我不建议这样做,只是向您展示您的选择,如果您是新手,我会暂时远离它。

基于此和您的 QuoteProvider 结构,您似乎有 2 个相同的结构:

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

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

QuoteDetailsQuoteDetails2 有什么区别?如果没有,那么你可以摆脱 QuoteDetails2 并更改

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

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

定义类型后,您可以多次重复使用该类型。

进行上述更改后,我相信这些错误应该会消失。

如果 Any

,您可以在同一个数组中同时包含 QuoteDetailsQuoteDetails2
var topQuotes = [Any]()
topQuotes.append(contentsOf: additionalQuotes)

任意数组中来自 QuoteDetails2 的不同 QuoteDetails

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
    }
}

您没有将字典数组附加到另​​一个字典数组,而是附加到不同类型的数组

如果您希望有两个单独的数组并可以合并它们,您可以向其中一个结构添加一个 init,该结构将另一个结构作为参数。

extension QuoteDetails {
    init(from details2: QuoteDetails2) {
        self.id = details2.id
        self.texts = details2.texts
        self.authors = details2.authors
    }
} 

然后添加另一个静态函数,returns 两个数组作为一个单独的数组

static func allQuotes() -> [QuoteDetails] {
     all() + all2().map(QuoteDetails.init)
}

另一种选择是创建两个结构都符合的协议,以便您可以使用该协议类型的通用数组

protocol Quote {
    var id: String { get }
    var texts: String { get }
    var authors: String { get }
}

然后是创建数组的函数

static func everyQuote() -> [Quote] {
    all() + all2()
}