我有两个struct和两个数组对应它我试图比较两个数组值并将其打印在一个已过滤的数组中我尝试使用过滤器但是它给了我一个错误我想要比较来自两者的id结构并得到一个单一的数组
Struct ONE
struct One {
let ID: String
let name: String
let lastName: String
}
Array One
var oneData = [One]()
oneData = [One(ID: "1", name: "hello1", lastName: "last2"), One(ID: "1", name: "hello2", lastName: "last2"), One(ID: "2", name: "hello3", lastName: "last3"), One(ID: "3", name: "hello4", lastName: "last4")]
结构二
struct Two {
let ID: String
let name2: String
let lastName2: String
}
数组二
var twoData = [Two]()
twoData = [Two(ID: "1", name2: "hello1", lastName2: "last1"), Two(ID: "2", name2: "hello2", lastName2: "last2"), Two(ID: "3", name2: "hello3", lastName2: "last3"), Two(ID: "4", name2: "hello4", lastName2: "last4"), Two(ID: "5", name2: "hello5", lastName2: "last5")]
我的过滤数组
var mainArray = [Two]()
我曾经过滤的代码,它给了我一个错误
mainArray = oneData.filter{ $0.ID == twoData.contains(where: $0.ID)}
答案 0 :(得分:2)
如果您希望仅将oneData
过滤为twoData
中具有匹配ID字段的元素,则需要:
let mainArray = oneData.filter { i in twoData.contains { i.ID == $0.ID } }
答案 1 :(得分:1)
您的mainArray
类型为[Two]
,并且您正尝试将[One]
类型的数据放入mainArray
。根据swift,这是错误的,你不能这样做。
你可以用另一种方式做到让我在10分钟内发布
现在你有2个选项可以制作通用协议,并用它确认结构,并按如下方式制作该协议类型的mainArray:
protocol Identifiable {
var id: String {get set}
var name: String {get set}
var lastName: String {get set}
}
struct One: Identifiable{
var id: String
var name: String
var lastName: String
}
struct Two: Identifiable{
var id: String
var name: String
var lastName: String
}
现在使主要类型Array可识别如下
var mainArray = [Identifiable]()
并过滤如下
mainArray = oneData.filter{ i in twoData.contains { i.id == $0.id }}
另一个选择是不要使协议可识别并让结构像以前一样。
只需使[One]
类型的mainArray不要忘记更改过滤器行的更改,即
由此:
mainArray = oneData.filter{ $0.ID == twoData.contains(where: $0.ID)}
对此:
mainArray = oneData.filter{ i in twoData.contains { i.id == $0.id }}
答案 2 :(得分:1)
获取数组oneData
的对象,其ID
与数组ID
中任何对象的twoData
匹配。你可以这样做:
// Array One
var oneData = [One]()
oneData = [One(ID: "1", name: "hello1", lastName: "last2"),
One(ID: "1", name: "hello2", lastName: "last2"),
One(ID: "2", name: "hello3", lastName: "last3"),
One(ID: "3", name: "hello4", lastName: "last4")]
// Array Two
var twoData = [Two]()
twoData = [Two(ID: "1", name2: "hello1", lastName2: "last1"),
Two(ID: "2", name2: "hello2", lastName2: "last2"),
Two(ID: "3", name2: "hello3", lastName2: "last3"),
Two(ID: "4", name2: "hello4", lastName2: "last4"),
Two(ID: "5", name2: "hello5", lastName2: "last5")]
let mainArray = oneData.filter { i in twoData.contains{ i.ID == $0.ID } }
print(mainArray)
答案 3 :(得分:0)
Swift标准库有一个Equatable协议,我们可以通过在扩展中添加static == operator函数到我们的类型来采用。您应该只创建一个如下所示的结构
struct Employee {
let id: String
let name: String
var lastName: String
}
extension Employee: Equatable {
static func == (lhs: Employee, rhs: Employee) -> Bool {
return lhs.name == rhs.name &&
lhs.id == rhs.id &&
lhs.lastName == rhs.lastName
}
}