Невозможно вызвать 'isEqualToString' со списком аргументов типа '(String)' (из замыкания) - PullRequest
0 голосов
/ 16 января 2019

Эта проблема связана с наличием двух разных условий для сравнения структуры.

Обычно я хотел бы, чтобы структура была уникальной, если ее идентификатор уникален. Но это не является частью проблемы здесь ... здесь, мне нужно создать уникальный набор из них, где уникальность зависит от множества условий. Я создаю массив из условие замыканий, а затем тестирую каждое в пользовательском 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 not (String):

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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)
0 голосов
/ 16 января 2019

Вы можете просто проверить, равен ли элемент id записи id свойства некоторого элемента из set

return !set.contains { $0.id == entry.id }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...