【发布时间】:2016-02-09 19:03:34
【问题描述】:
我有一个继承自 NSManagedObject 的自定义类 (VotingOption),有时我想检查数组中的某些投票选项是否重复。我试图使我的代码尽可能通用。这是我为扩展 CollectionType 协议所做的:
extension CollectionType where Self.Generator.Element : Equatable {
var duplicates: [Self.Generator.Element]{
return = self.filter { element in
return self.filter { $0 == element }.count != 1
}
}
var hasDuplicates: Bool {
return (self.duplicates.count != 0)
}
}
这就像一个魅力,除了它没有使用全局函数:
func ==(lhs: VotingOption, rhs: VotingOption) -> Bool {
return (lhs.location?.title.lowercaseString == rhs.location?.title.lowercaseString) && (lhs.startDate == rhs.startDate)
}
当我做这样的事情时:
let temp: [VotingOption] = votingOptions?.array as? [VotingOption]
if temp.hasDuplicates {
//do something
}
当我像这样在 VotingOption 中扩展 isEqual 时:
class VotingOption: NSManagedObject {
override func isEqual(object: AnyObject?) -> Bool {
if let rhs = object as? VotingOption {
return (self.location?.title.lowercaseString == rhs.location?.title.lowercaseString) && (self.startDate == rhs.startDate)
} else {
return false
}
}
...
...
... rest of class
}
应用程序崩溃并指向 AppDelegate 并出现“libc++abi.dylib:以未捕获的 NSException 类型异常终止”错误
如何告诉 CollectionType 中的“==”使用 VotingOption 的全局函数?
【问题讨论】:
-
起初 CollectionType 是协议,而不是类!你剩下的问题不是很清楚,至少对我来说。您的期望是什么?为什么?
-
VotingOption是否继承自NSObject?在这种情况下,您必须覆盖isEqual,请参阅NSObject subclass in Swift: hash vs hashValue, isEqual vs ==。 -
@MartinR 是的,它继承自 NSObject。我试过覆盖 isEqual 但它一直在崩溃。我已经编辑了这个问题。请查看添加内容
-
好的,所以这是一个 NSManagedObject 子类。文档声明您不得在 NSManagedObject 子类上覆盖
isEqual:。看来你倒霉了…… -
你能提供一个链接来证实这一点吗?