Arrays 使用Swift计算嵌套数组中的唯一ID

Arrays 使用Swift计算嵌套数组中的唯一ID,arrays,swift,Arrays,Swift,我有下面的嵌套数组,我试图计算有多少具有唯一id的项。在下面的数组中,计数应为2 数组的类型为List它来自领域 class SolData: Object { @objc dynamic var uid = ""; @objc dynamic var id = ""; } extension SolData: ListDiffable { func diffIdentifier() -> NSObjectProtocol { return uid

我有下面的嵌套数组,我试图计算有多少具有唯一
id
的项。在下面的数组中,计数应为2

数组的类型为
List
它来自领域

class SolData: Object {
    @objc dynamic var uid = "";
    @objc dynamic var id = "";
}

extension SolData: ListDiffable {
    func diffIdentifier() -> NSObjectProtocol {
        return uid as NSObjectProtocol
    }

    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        if let object = object as? SolData {
            return uid == object.uid
        }
        return false
    }
}
阵列的打印

 (
    [0] SolData {
        uid = sdasd;
        id = jmX3;
    },
    [1] SolData {
        uid = gfd;
        id = jmX3;
    },
    [2] SolData {
        uid = hgfd;
        id = jmX3;
    },
    [3] SolData {
        uid = terw;
        id = jmX3;
    },
    [4] SolData {
        uid = fgg;
        id = GFdda;
    }
)
我试着以以下方式使用
map

var count = 0;
var prevId = "";

let uniqueSols = diff.sol.map{ (s) -> Int in
  if s.id != prevId {
    count = count + 1;
    prevId = s.id;
  }
  return count;
}

print(uniqueSols);
但是我得到了以下错误

SWIFT运行时错误:无法指定字段“\u transform”的类型。损坏的类型名称为'q_7ElementSTQzc' 2018-10-27 14:26:08.793528+0300应用程序[23634:611928]SWIFT运行时错误:无法对字段类型“_transform”进行demangle。损坏的类型名称为'q_7ElementSTQzc',_transform:())


为了重现您的代码,我将模拟
SolData
类,并添加一个初始值设定项以简化实例化:

class SolData {
    var uid: String = ""
    var id: String = ""

    init(uid: String, id: String) {
        self.uid = uid
        self.id  = id
    }
}
让我们创建几个实例:

let zero  = SolData(uid: "sdasd", id: "jmX3")
let one   = SolData(uid: "gfd",   id: "jmX3")
let two   = SolData(uid: "hgfd",  id: "jmX3")
let three = SolData(uid: "terw",  id: "jmX3")
let four  = SolData(uid: "fgg",   id: "GFdda")
并将它们分组到一个数组中:

let array = [zero, one, two, three, four]
要仅获取具有唯一ID的实例,请使用:


如果需要具有唯一ID的实例数组,请使用以下命令:

let instancesWithUniqueIds = array.reduce(into: [SolData]()) { accumulator, element in
    if accumulator.allSatisfy({ $0.id != element.id}) {
        accumulator.append(element)
    }
}

acculator.allsuccess({$0.id!=element.id})
可能被
acculator.contains(element)
替换,并使
SolData
符合
Hashable

您开始使用的数组是什么?什么是
jmX3
GFdda
?什么是字段
\u变换
?一定要让你的问题很容易在游戏中重现并添加更多代码。没有_变换字段。对我来说,这似乎是一个奇怪的错误。什么是
listdifvable
Object
?您想知道唯一的元素还是它们的计数
map
用于将
n
输入元素转换为
n
输出元素。要在
1
输出元素中打开
n
输入元素(计数将仅为一个输出),您可以使用
reduce
。为什么要投反对票?我一直在问这个问题,老兄!谢谢,这正是我需要的!嘿@Carpsen90我一直在讨论这个问题,但我还有一个问题与上述有关。我在应用程序中有一个不同的部分,我对每个
循环使用
,并
解决方案附加到
var arr:[SolData]=[SolData]()。当我试图减少该数组时,它会给我以下错误
无法将类型“Set”的值分配给类型“[SolData]”
为什么在这种情况下上述方法不能减少工作?@Ando这对于新问题更合适,但我添加了一些代码来提供一个唯一实例的数组,而不是原来的问题:唯一ID的计数。谢谢,太多了!我认为这是对答案的一个很好的补充,因为这两个词是常用的;此外,我现在可以从你的答案的第二部分中计算出减少的结果。再次感谢你!
let uniqueIdsCount = uniqueIds.count  //2
let instancesWithUniqueIds = array.reduce(into: [SolData]()) { accumulator, element in
    if accumulator.allSatisfy({ $0.id != element.id}) {
        accumulator.append(element)
    }
}