2

から継承するカスタム クラス (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
}

次のように 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
}

アプリがクラッシュし、「libc++abi.dylib: 種類 NSException のキャッチされない例外で終了しています」というエラーで AppDelegate を指しています。

CollectionType の "==" に VotingOption のグローバル関数を使用するように指示するにはどうすればよいですか?

4

2 に答える 2

1

duplicatesこれは、 and を2 回 (要素用に 1 回、クラス用hasDuplicatesに 1 回)実装するソリューションです。コードの重複を可能な限り減らすために、2 つの要素を比較する関数/クロージャを渡すことができる重複を見つけるための一般的な実装を定義しました。EquatableVotingOptions

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)
    }
}
于 2016-02-10T07:13:34.483 に答える