Skip to content

Instantly share code, notes, and snippets.

@blainerothrock
Last active June 22, 2017 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blainerothrock/75a7d468c7377ccac1ec4dca60ecd597 to your computer and use it in GitHub Desktop.
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
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