我有一个名为remindersArray
的数组,其中包含一个名为Reminder
的自定义对象(每个Reminder
对象都有title
和identifier
)。
内部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'
任何想法如何从数组中删除带有此标识符的对象?
谢谢!
答案 0 :(得分:2)
请参阅indexOf(_:)
的两个CollectionType
方法标题:
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
可能包含多个具有相同Reminder
的{{1}}个实例,则应该有效:
identifier
选择一个(或更多?)并试一试。
答案 1 :(得分:1)
您可以过滤掉不需要的提醒:
static func removeReminderWithIdentifier(reminderIdentifier: String) {
Reminder.remindersArray = Reminder.remindersArray.filter { $0.identifier != reminderIdentifier }
}
可替换地:
func removeReminderWithIdentifier(reminderIdentifier: String) {
remindersArray = remindersArray.filter { $0.identifier != reminderIdentifier }
}
以最新的快速命名风格......:
func removeReminders(with identifier: String) {
remindersArray = remindersArray.filter { $0.identifier != identifier }
}