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

标签 ios iphone arrays swift cocoa-touch

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

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'

知道如何从数组中删除具有此标识符的对象吗?

谢谢!

最佳答案

请参阅 CollectionType 的两个 indexOf(_:) 方法的 header :

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 平等的:

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}
}

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

关于ios - 从数组中删除自定义对象 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305724/

相关文章:

javascript - Node.js - 将整个字符串数组转换为字符串,其中字符串由 | 分隔

arrays - Swift - 基于比较两个数组值的结果的新数组

ios - 更改设备方向时旋转 uiscrollview

iphone - 动态调整 MPMoviePlayerController 的大小

iphone - 显示蜂窝数据已关闭警报

使用 OpenCV 和 AVFoundation 框架的 iPhone 实时图像处理?

android - 使用自定义图标推送通知

ios - 如何删除 iOS 中 NSString 中的第一个和最后一个 {}?

iphone - MPMoviePlayer 或 AVPlayer 帧推进

javascript - 通过组合另一个数组的两列来形成一个新的javascript数组