swift 将数组追加到不同类型的数组

fcy6dtqo  于 2023-05-16  发布在  Swift
关注(0)|答案(3)|浏览(204)

我有两个不同类型的数组。其中一个继承了一些变量并扩展了它们。我想把第一个数组追加到第二个数组,但我得到了这个错误:

No exact matches in call to instance method 'append'

这是类的样子:

class FirstModel {
    let name: String
    let id: Int
}

class SecondModel: FirstModel {
    let number: Int
}

以下是数组:

var firstArray: [FirstModel] = []
var secondArray: [SecondModel] = []

在视图中有一个附加它们的按钮(这里是错误):

Button("Do something") {
    secondArray.append(contentsOf: firstArray)
}

I've seen this,但是在我的情况下,你如何解码数组来做同样的事情呢?

rdrgkggo

rdrgkggo1#

如前所述,您可以使用一个协议来表示两个模型的共同行为。

import SwiftUI

struct FirstModel: Model {
    var number: Int
    let name: String
}

struct SecondModel: Model {
    var number: Int
}

protocol Model {
    var number: Int { get set }
}

struct ContentView: View {
    
    @State private var firstArray: [FirstModel] = []
    @State private var secondArray: [SecondModel] = []
    @State private var finalArray: [Model] = []
    
    init() {
        // if you want to initialize the finalArray with firstArray
        finalArray.append(contentsOf: firstArray)
    }
    
    var body: some View {
        Button("Add") {
            finalArray.append(contentsOf: secondArray)
        }
    }
}
xpszyzbs

xpszyzbs2#

问题是不是所有的FirstModel都是SecondModel。因此,将FirstModel s添加到只能存储SecondModel s的数组中没有意义。
如果希望secondArray能够存储FirstModel s和SecondModel s,则应将其类型设置为[FirstModel]。然后在你的应用程序中你可以写一些类似于

ForEach(secondArray) { model in
    if let secondModel = model as? SecondModel {
        // This model is a `SecondModel`
    }
    else {
        // It's just a `FirstModel`
    }
}

另一种解决方案是将secondArray保留为[SecondModel],但将附加代码更改为:

secondArray.append(contentsOf: firstArray.compactMap { $0 as? SecondModel })

这种方法只从firstArray中提取实际上是SecondModel s的元素。查看compactMaphere的文档。
我不知道哪种解决方案最适合你,因为这取决于你想要什么样的行为,但我希望这对你有帮助!

umuewwlo

umuewwlo3#

简单的解决方案是将secondArray的元素添加到firstArray中,因为SecondModel继承自FirstModel

firstArray.append(contentsOf: secondArray)

或创建新阵列

let all = firstArray + secondArray

如果必须是secondArray来保存所有元素,则需要将其定义更改为

var secondArray: [FirstModel] = []

相关问题