在Swift中调用实例方法'append'时没有找到精确匹配。

4
尝试将两个模型合并为一个模型 第一个模型 = 项目 [InboxModel]。(我的收件箱) 第二个模型 = items2 [MoInboxModel] (SDK 收件箱) 1st + 2nd -> combinedItems
private var items: [InboxModel] = []
private var items2: [MoInboxModel] = []
private var combinedItems: [combinedInboxModel] = []

struct InboxModel {
    let id: String
    let title: String
    let message: String
    let date: Date
}

struct MoInboxModel {
    let id: String
    let title: String
    let message: String
    let date: Date
}

struct combinedInboxModel {
    let id: String
    let title: String
    let message: String
    let date: Date
}

self?.combinedItems.append(self?.items). //No exact matches in call to instance method 'append
self?.combinedItems.append(contentsOf: self?.items2 ?? []) //No exact matches in call to instance method 'append

为什么合并时会出现错误?如何正确地合并?


你好,根据您的代码,您是无法做到的,但是可以使用"associatedtype"来实现,我从未尝试过。或者您可以像@Paulw11建议的那样去做。 - Bhavesh Lathigara
2个回答

4

您有三种不相关的类型 - InboxModelMoInboxModelcombinedInboxModel (应该是 CombinedInboxModel)。即使它们都具有相同名称的属性,它们也是不同的类型。

combinedInboxModel 数组上没有接受 InboxModelMoInboxModel 数组的 append 函数。

您可以在每个输入数组上使用 map 将它们转换为 CombinedInboxModel 数组,然后将其放入 combinedItems 中。

假设您正在一个闭包中编写此代码,因此您有一个 weak self。最好先处理它,然后再处理数组。

guard let self = self else {
    return
}

self.combinedItems = self.items.map { CombinedInboxModel(id:$0.id,title:$0.title,message:$0.message,date:$0.date) }

let items2 = self.items2.map { CombinedInboxModel(id:$0.id,title:$0.title,message:$0.message,date:$0.date) }

self.combinedItems.append(contentsOf:items2)

您还没有说明 itemsitems2 来自哪里;是否可能一开始就将它们作为相同结构的实例获取?

所以我需要做的是:combinedItems = items.map,combinedItems += items2.map ? - lauwis

2

你有三个具有相同属性的结构体,这有点可疑。如果我是你,我会考虑不同的设计。

然而,如果你必须采用这种方法,你可能需要考虑从协议开始,并且摆脱combinedInboxModel结构体。

protocol InboxModelable {
    var id: String { get }
    var title: String { get }
    var message: String { get }
    var date: Date { get }
}

现在让你的两个结构体符合 InboxModelable

struct InboxModel: InboxModelable {
    let id: String
    let title: String
    let message: String
    let date: Date
}

struct MoInboxModel: InboxModelable {
    let id: String
    let title: String
    let message: String
    let date: Date
}

由于您两种类型都符合InboxModelable,您可以直接将这两种类型存储在类型为Array<InboxModelable>的数组中,而无需映射元素。
class SomeClass {
    private var items: [InboxModel] = []
    private var items2: [MoInboxModel] = []
    private var combinedItems: [InboxModelable] = []

    func combineItems() {
        doSomething { [weak self] in
            guard let self = self else { return }
            self.combinedItems.append(contentsOf: self.items)
            self.combinedItems.append(contentsOf: self.items2)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接