我有兩個報價詞典,我試圖在應用內購買后附加。我嘗試了幾種不同的方法將字典附加在一起,但我仍然收到錯誤“呼叫實體方法'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]
}
}
uj5u.com熱心網友回復:
這應該是一條評論,但在沒有格式化的情況下解釋 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
}
QuoteDetails和 和有什么不一樣QuoteDetails2?如果什么都沒有,那么你可以擺脫QuoteDetails2和改變
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()
到
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails]()
定義型別后,您可以多次重用該型別。
進行上述更改后,我相信錯誤應該會消失。
uj5u.com熱心網友回復:
如果是,您可以同時擁有QuoteDetails和QuoteDetails2在同一個陣列中Any
var topQuotes = [Any]()
topQuotes.append(contentsOf: additionalQuotes)
到 Any Array 中的 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
}
}
您不會將字典陣列附加到另??一個字典陣列,而是附加到具有不同型別的陣列
uj5u.com熱心網友回復:
如果您想擁有兩個單獨的陣列并可以合并它們,您可以將一個 init 添加到一個將另一個結構作為引數的結構中。
extension QuoteDetails {
init(from details2: QuoteDetails2) {
self.id = details2.id
self.texts = details2.texts
self.authors = details2.authors
}
}
然后添加另一個靜態函式,將兩個陣列作為一個陣列回傳
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()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435831.html
上一篇:如何使用指標將陣列傳遞給函式
下一篇:使用一維陣列,如何識別是否重復
