无法使用类型为((String)'(从闭包)的参数列表调用'isEqualToString'

时间:2019-01-16 20:12:11

标签: swift

此问题源于比较结构的两个不同条件。

通常,如果结构的ID是唯一的,我希望该结构是唯一的。但这不是问题的一部分。在这里,我需要根据它们建立唯一的集合,其中唯一性来自多个条件。我正在构建一个 condition 闭包数组,然后在自定义TimeSeries类中测试每个闭包,这就是计划(尽管一种覆盖集合条件的方法会让我只使用一个简单的条件精细)。但是我在关闭本身上遇到了一个问题。

{(_ entry: TimeSeriesEntry, _ set: [TimeSeriesEntry]) -> Bool in
    return !set.contains({ item in item.id.isEqualToString(entry.id) })
}

我不清楚为什么报告Cannot invoke 'isEqualToString' with an argument list of type '(String)' TimeSeriesEntry.id被定义为String而不是(字符串)的原因:

struct TimeSeriesEntry: Codable, Equatable {
    let id: String
    let uid: String
    let date: Date
    let apps: [String:Double]
    let locations: [String:Bool]
}

2 个答案:

答案 0 :(得分:2)

isEqualToString属于NSString。在本机Swift中,它要容易得多

{(entry, set) -> Bool in // the underscores and types are unused in Swift 3+
    return !set.contains { $0.id == entry.id }
}

这可能更有效

!set.map{$0.id}.contains(entry.id)

答案 1 :(得分:1)

您可以仅检查条目的crosscheck是否等于id中某个元素的id属性

set