SwiftDiff is a (partial) port of the Google Diff, Match and Patch Library (google-diff-match-patch) to Swift. The Google Diff, Match and Patch Library was originally written by Neil Fraser.
So far only the diff algorithm has been ported. It allows comparing two blocks of plain text and efficiently returning a list of their differences. It supports detecting in-line text differences.
SwiftDiff was updated to Swift 5 and SPM 5.1 by Cyberfun. It was updated to Swift and SPM 5.7 and improved by niklhut.
To use SwiftDiff, add the following package dependency:
.package(url:"https://github.com/niklhut/SwiftDiff.git", from:"1.0.0")lettext1="The quick brown fox jumps over the lazy dog."lettext2="That quick brown fox jumped over a lazy dog."letmyDiff=diff(text1: text1, text2: text2)The diff would look like the following:
[.equal(text:"Th"),.delete(text:"e"),.insert(text:"at"),.equal(text:" quick brown fox jump"),.delete(text:"s"),.insert(text:"ed"),.equal(text:" over "),.delete(text:"the"),.insert(text:"a"),.equal(text:" lazy dog.")]To find any overlaps between deletions and insertions you can use cleanupSemantic(diffs: [Diff]) or directly call .cleaningUpSemantics() on an array of Diff:
lettext3="The quick brown fox goes through the forest."lettext4="The brown fox quickly goes home."letmyDiff2=diff(text1: text3, text2: text4).cleaningUpSemantics()So the diff is cleaned up and looks like the following
[.equal(text:"The "),.delete(text:"quick "),.equal(text:"brown fox "),.delete(text:"goes through the forest"),.insert(text:"quickly goes home"),.equal(text:".")]instead of
[.equal(text:"The "),.delete(text:"quick "),.equal(text:"brown fox "),.insert(text:"quickly "),.equal(text:"goes "),.delete(text:"t"),.equal(text:"h"),.delete(text:"r"),.equal(text:"o"),.delete(text:"ugh th"),.insert(text:"m"),.equal(text:"e"),.delete(text:" forest"),.equal(text:".")]Since the Diff is Codable it can easily be converted to, for example, JSON:
letjsonEncoder=JSONEncoder()
jsonEncoder.outputFormatting =.prettyPrinted // only for nicer displaying
letjsonData=try jsonEncoder.encode(myDiff2)letjson=String(data: jsonData, encoding:.utf8)print(json!)Output:
[
{
"equal" : {
"text" : "The "
}
},
{
"delete" : {
"text" : "quick "
}
},
{
"equal" : {
"text" : "brown fox "
}
},
{
"delete" : {
"text" : "goes through the forest"
}
},
{
"insert" : {
"text" : "quickly goes home"
}
},
{
"equal" : {
"text" : "."
}
}
]SwiftDiff is licensed under the Apache License 2.0 – see the LICENSE file for details.
The original Google Diff, Match and Patch Library is also licensed under the same license and Copyright (c) 2006 Google Inc.