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



我有以下嵌套数组,我正在尝试计算有多少具有唯一ids的项目。在下面的数组中,计数应为 2。

数组的类型List<SolData>它来自 Realm

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 运行时错误:无法解散字段类型"_transform"。 损坏的类型名称为"q_7ElementSTQzc" 2018-10-27 14:26:08.793528+0300 App[23634:611928] SWIFT 运行时错误:无法分解字段"_transform"的类型。损坏的类型名称为"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 的实例,让我们使用reduce(into:)

let uniqueIds = array.reduce(into: Set<String>(), { $0.insert($1.id)})

uniqueIds的 count 属性是array中唯一 id 的数量:

let uniqueIdsCount = uniqueIds.count  //2

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

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

accumulator.allSatisfy({ $0.id != element.id})可能会被accumulator.contains(element)取代,并SolData符合Hashable.

最新更新