从数组中删除自定义对象(Swift)

4

我有一个名为remindersArray的数组,其中包含一个名为Reminder的自定义对象(每个Reminder对象都有titleidentifier)。

Reminder内部,我有一个名为removeReminderWithIdentifier的静态函数,它应该查找提醒并从数组中删除它。

我尝试像这样做:

static func removeReminderWithIdentifier(reminderIdentifier: String) {
    for currentReminder in Reminder.remindersArray {
        if currentReminder.identifier == reminderIdentifier {
            Reminder.remindersArray.removeAtIndex(Reminder.remindersArray.indexOf(currentReminder)) //Compile error
        }
    }
}

但是它给我返回了这个编译错误:
Cannot convert value of type 'Reminder' to expected argument type '@noescape (Reminder) throws -> Bool'

你有什么想法可以从数组中删除具有此标识符的对象吗?

谢谢!


我遇到了完全相同的问题! - SilverWolf
2个回答

2

请查看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.ElementReminder

因此,避免这个错误的一种方法是使您的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可能包含多个具有相同identifierReminder实例,则应该使用以下方法:
static func removeReminderWithIdentifier3(reminderIdentifier: String) {
    Reminder.remindersArray = Reminder.remindersArray.filter{$0.identifier != reminderIdentifier}
}

选择一个(或多个?)尝试一下。


1

您可以过滤掉不需要的提醒:

static func removeReminderWithIdentifier(reminderIdentifier: String) {
    Reminder.remindersArray = Reminder.remindersArray.filter { $0.identifier != reminderIdentifier }
}

交替:

func removeReminderWithIdentifier(reminderIdentifier: String) {
    remindersArray = remindersArray.filter { $0.identifier != reminderIdentifier }
}

而在最新的 Swift 命名风格中...:
func removeReminders(with identifier: String) {
    remindersArray = remindersArray.filter { $0.identifier != identifier }
}

Cannot call value of non-function type '[Reminder]' - FS.O6
没有看到你的代码,我只是猜测...移除 static 前缀以及函数中对 Reminder 的两个引用。我已经相应地更新了答案。 - Vince O'Sullivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接