読者です 読者をやめる 読者になる 読者になる

ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

【iOS,Swift3】Extension晒す〜Array編〜

Androidエンジニアと見せかけて、
iOSエンジニア風を装って、
Unityエンジニアのふりして、
インフラエンジニアもちょっと名乗って、
当たり前のようにWebエンジニアとして仕事もするけど、
本業は未だに.NETエンジニアと思いたいけどたぶんもう無理で、
実際の身分はCEOとプレCTOとアプリ開発責任者の伊豆丸さんです。

表題の通りです。ご査収ください。

import Foundation

extension Array where Element: Hashable, Element: Equatable {
    
    public func diff(_ other: [Element]) -> [Element] {
        let all = self + other
        var counter: [Element: Int] = [:]
        all.forEach { counter[$0] = (counter[$0] ?? 0) + 1 }
        return all.filter { (counter[$0] ?? 0) == 1 }
    }
    
    public func subtracting(_ other: [Element]) -> [Element] {
        return self.flatMap { element in
            if (other.filter { $0 == element }).count == 0 {
                return element
            } else {
                return nil
            }
        }
    }
    
    public mutating func subtract(_ other: [Element]) {
        self = subtracting(other)
    }
}