将字典数组附加到 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
}
QuoteDetails
和 QuoteDetails2
有什么区别?如果没有,那么你可以摆脱 QuoteDetails2
并更改
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()
至
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails]()
定义类型后,您可以多次重复使用该类型。
进行上述更改后,我相信这些错误应该会消失。
如果 Any
,您可以在同一个数组中同时包含 QuoteDetails
和 QuoteDetails2
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()
}
我有两个报价词典,我想在应用程序内购买后追加。我尝试了几种不同的方法将字典附加在一起,但我仍然收到错误消息“在调用实例方法 '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
}
QuoteDetails
和 QuoteDetails2
有什么区别?如果没有,那么你可以摆脱 QuoteDetails2
并更改
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails2]()
至
var topQuotes = [QuoteDetails]()
var additionalQuotes = [QuoteDetails]()
定义类型后,您可以多次重复使用该类型。
进行上述更改后,我相信这些错误应该会消失。
如果 Any
QuoteDetails
和 QuoteDetails2
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()
}