swift 核心数据:试图从关系中获取uuid数组,但出现“No exactly matches in reference to static method 'buildExpression'”错误

anhgbhbe  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(805)

如果我有一个与OrderProduct有一对多关系的Core Data Order实体(具有数量属性),而OrderProduct与Product有一对多关系,我如何从Order中获取Product ID数组?
我扩展了Order,并添加了一种获取OrderProducts数组的方法:

extension Order {
    
    public var wrappedName : String {
        name ?? "Unknown Order name"
    }
    
    public var orderProductArray: [OrderProduct] {
        let set = orderProduct as? Set<OrderProduct> ?? []
        
        return set.sorted {
            $0.product?.wrappedName ?? "" < $1.product?.wrappedName ?? ""
        }
    } 
}

这对于从订单中获取OrderProducts列表非常有效,但我想从订单中获取订单中的产品ID数组。我尝试将此添加到扩展产品中:

public var productIdArray: [String] {
    var tempUuids: [String] = []
    
    ForEach (orderProductArray) { op in
        if let tempUuid = op.product?.id?.uuidString {
            tempUuids.append(tempUuid)
        }
    }
    return tempUuids
}

但我得到一个错误:
在对静态方法“buildExpression”的引用中没有精确匹配

hvvq6cgz

hvvq6cgz1#

ForEach()用于SwiftUI。它允许您迭代一个随机集合(通常是Array),并在每次迭代时创建一个视图。
在这里,你不是在“SwiftUI”中,你只是想迭代那个数组。
所以你需要forEach()

ForEach (orderProductArray) { op in
    ...
}

->

orderProductArray.forEach { op in
    ...
}

顺便说一下,你也可以使用compactMap()来做这件事,根据你的代码:

public var productIdArray: [String] {
    return orderProductArray.compactMap { op in
        guard let tempUuid = op.product?.id?.uuidString else { return nil }
        return tempUuid
    }
}

我将解释原因:你遍历数组,对于每个元素,你返回不同的东西,也就是你把每个元素“转换”成另一个元素。所以是map()好了,这几乎就是你的代码了,事实上,你跳过了一些值,所以你需要使用一个compactMap()。它与map()相同,除了当您返回nil时,它与跳过值相同。
可以简化为:

public var productIdArray: [String] {
    return orderProductArray.compactMap { op in
        op.product?.id?.uuidString
    }
}

然后进入:

public var productIdArray: [String] {
   orderProductArray.compactMap { $0.product?.id?.uuidString }
}

但请保留当前Swift级别可以调试和修改的版本。

相关问题