我有以下嵌套数组,我正在尝试计算有多少具有唯一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
.