Last active
June 22, 2017 14:10
-
-
Save blainerothrock/75a7d468c7377ccac1ec4dca60ecd597 to your computer and use it in GitHub Desktop.
Salesforce 15 character case sensitive Id to 18 character case insensitive Id in Swift 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
extension String { | |
func isUppercased(at: Index) -> Bool { | |
let range = at..<self.index(after: at) | |
return self.rangeOfCharacter(from: .uppercaseLetters, options: [], range: range) != nil | |
} | |
} | |
extension Character { | |
var isUppercase: Bool { | |
let str = String(self) | |
return str.isUppercased(at: str.startIndex) | |
} | |
} | |
var ori = "005i0000001wr9E" | |
let lex = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U", "V","W","X","Y","Z","0","1","2","3","4","5"] | |
/* | |
return a 1 character string converted from binary generated from count of uppercase characters | |
*/ | |
func getSalesforceCharacterRepresentation(for id:String,with startOffset:Int, endOffset: Int) -> String? { | |
let start = id.index(id.startIndex, offsetBy: startOffset) | |
let end = id.index(id.endIndex, offsetBy: endOffset) | |
let range = start..<end | |
let subString = id.substring(with: range) | |
var binaryString = "" | |
for i in subString.characters.indices { | |
if subString[i].isUppercase { | |
binaryString += "1" | |
} else { | |
binaryString += "0" | |
} | |
} | |
if let index = Int(String(binaryString.characters.reversed()), radix: 2) { | |
return lex[index] | |
} | |
return nil | |
} | |
/* | |
will convert a 15 character case sensitve Salesforce id to a 18 character case insensitive id | |
*/ | |
func caseInsensitveSalesforceId(from id: String) -> String? { | |
if id.characters.count == 18 { return id } | |
if id.characters.count != 15 { return nil } | |
let start = getSalesforceCharacterRepresentation(for: id, with: 0, endOffset: -10) ?? "" | |
let middle = getSalesforceCharacterRepresentation(for: id, with: 5, endOffset: -5) ?? "" | |
let end = getSalesforceCharacterRepresentation(for: id, with: 10, endOffset: 0) ?? "" | |
let insensitiveId = id + start + middle + end | |
if insensitiveId.characters.count == 18 { return insensitiveId } | |
return nil | |
} | |
caseInsensitveSalesforceId(from: ori) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment