Swift 斯威夫特没有';不要叫我的==&引用;扩展CollectionType时运算符重载

Swift 斯威夫特没有';不要叫我的==&引用;扩展CollectionType时运算符重载,swift,equatable,Swift,Equatable,我有一个自定义类(VotingOption),它继承自NSManagedObject,有时我想检查数组中的一些投票选项是否重复。我正在努力使我的代码尽可能通用。这是我为扩展CollectionType协议所做的: extension CollectionType where Self.Generator.Element : Equatable { var duplicates: [Self.Generator.Element]{ return = self.filter

我有一个自定义类(VotingOption),它继承自
NSManagedObject
,有时我想检查数组中的一些投票选项是否重复。我正在努力使我的代码尽可能通用。这是我为扩展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
}
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
}
当我像这样扩展isEqual in Voting选项时:

let temp: [VotingOption] = votingOptions?.array as? [VotingOption]
if temp.hasDuplicates {
     //do something
}
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的全局函数?

这里有一个解决方案,它实现了两次
重复项和
hasDuplicates
,一次用于
equalable
元素,一次用于
VotingOptions
类。为了尽可能减少代码重复,我定义了一个查找重复的通用实现,它允许您传递一个比较两个元素的函数/闭包:

extension CollectionType {

    func findDuplicates(checkEqual: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element]{
        return self.filter { element in
            return self.filter { checkEqual($0, element) }.count != 1
        }
    }
}

extension CollectionType where Self.Generator.Element : Equatable {

    var duplicates: [Self.Generator.Element]{
        return self.findDuplicates(==)
    }

    var hasDuplicates: Bool {
        return (self.duplicates.count != 0)
    }
}

extension CollectionType where Self.Generator.Element : VotingOption {

    var duplicates: [Self.Generator.Element]{
        return self.findDuplicates {lhs, rhs in
            return (lhs.location?.title.lowercaseString == rhs.location?.title.lowercaseString) && (lhs.startDate == rhs.startDate)
        }
    }

    var hasDuplicates: Bool {
        return (self.duplicates.count != 0)
    }
}

谢谢所有帮助过我的人。我将在此处发布最终实施: 基本上使用方法“equals”创建了一个新的协议“Identity”,该方法基本上是“==”,最后为实现“Identity”的NSManagedObject添加了一个通用扩展,该扩展在“equals”方法中基本上是“==”。但是,在“VotingOption”中,我已根据自己的具体需要覆盖了此函数。最后,对集合类型进行了扩展,其中“元素”是“标识”。它调用的不是“==”而是“equals”方法:)


首先CollectionType是协议,而不是类!你剩下的问题不是很清楚,至少对我来说是这样。您的期望是什么?为什么?
VotingOption
继承自
NSObject
?在这种情况下,您必须重写
isEqual
,请参阅。@MartinR Yes它继承自NSObject。我曾试图推翻isEqual,但它不断崩溃。我已经编辑了这个问题。请检查additionsOK,这是一个NSManagedObject子类。文档中规定,您不能覆盖NSManagedObject子类上的
isEqual:
。看来你运气不好…你能提供一个链接来证实这一点吗?谢谢!实际上,我最终得到了一个不同的实现(有点类似于您)。我会接受你的回答,因为这是最接近我需要的。最主要的是它并不像我需要的那样“通用”。我会更新我的问题