查看CollectionType的两个indexOf(_:)方法的标题:
extension CollectionType where Generator.Element : Equatable {
/// Returns the first index where `value` appears in `self` or `nil` if
/// `value` is not found.
///
/// - Complexity: O(`self.count`).
@warn_unused_result
public func indexOf(element: Self.Generator.Element) -> Self.Index?
}
extension CollectionType {
/// Returns the first index where `predicate` returns `true` for the
/// corresponding value, or `nil` if such value is not found.
///
/// - Complexity: O(`self.count`).
@warn_unused_result
public func indexOf(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Index?
}
如果您想使用第一个 indexOf(_:)(您正在代码中尝试),则元素类型需要为 Equatable。当您的 Reminder 类不符合 Equatable 时,Swift 会忽略第一个 indexOf(_:),因此第二个可能是唯一的候选者,将 @noescape (Self.Generator.Element) throws -> Bool 作为其唯一参数。在您的情况下,Self.Generator.Element 是 Reminder。
因此,避免此错误的一种方法是使您的 Reminder 符合 Equatable。
extension Reminder: Equatable {}
func == (lhs: Reminder, rhs: Reminder) -> Bool {
return lhs.identifier == rhs.identifier /* && ... you may need more complex condition. */
/* return lhs === rhs //or simple use `===`. */
}
但你有一些选择:
如果你的reminderArray 只包含一个元素对应每个唯一的identifier,你可以写这样的东西,而不用让你的Reminder Equatable:
static func removeReminderWithIdentifier(reminderIdentifier: String) {
if let index = Reminder.remindersArray.indexOf({$0.identifier == reminderIdentifier}) {
Reminder.remindersArray.removeAtIndex(index)
}
}
如果您的remindersArray 可能包含多个具有相同identifier 的Reminder 实例,则应该可以:
static func removeReminderWithIdentifier3(reminderIdentifier: String) {
Reminder.remindersArray = Reminder.remindersArray.filter{$0.identifier != reminderIdentifier}
}
选择一个(或更多?)并尝试一下。