我有一个名为 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.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
平等的
:
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}
}
选择一个(或多个?)并尝试一下。
关于ios - 从数组中删除自定义对象 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305724/