Skip to content

Instantly share code, notes, and snippets.

@whoyawn
Created November 9, 2021 17:58
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 whoyawn/c5ce8fe76d5e32ea0992efddd8d96c55 to your computer and use it in GitHub Desktop.
Save whoyawn/c5ce8fe76d5e32ea0992efddd8d96c55 to your computer and use it in GitHub Desktop.
Generate random passwords with OptionsSet
/**
Generate random String of given size in Swift
Given a size as n, generate a random alphanumeric String of this size.
// elements of Swift CharacterSet are Unicode.Scalar and we cannot view the members so we cannot use CharacterSet.
*/
struct CharSet: OptionSet {
let rawValue: Int
// 1111, each bit represents one value
static let lowercase: CharSet = CharSet(rawValue: 1 << 0)
static let uppercase: CharSet = CharSet(rawValue: 1 << 1)
static let numbers: CharSet = CharSet(rawValue: 1 << 2)
static let symbols: CharSet = CharSet(rawValue: 1 << 3)
static let all: CharSet = [.lowercase, .uppercase, .numbers, .symbols]
}
struct PasswordGenerator {
var charSet: CharSet = .lowercase
mutating func toggleOff(type: CharSet) {
charSet.remove(type)
}
mutating func toggleOn(type: CharSet) {
charSet.insert(type)
}
func generate(n: Int) -> String {
assert(n <= 20, "Password too long")
var possibleCharacters: [Character] = []
if charSet.contains(.lowercase) {
possibleCharacters.append(contentsOf: "abcdefghijklmnopqrstuvwxyz")
}
if charSet.contains(.uppercase) {
possibleCharacters.append(contentsOf: "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
}
if charSet.contains(.numbers) {
possibleCharacters.append(contentsOf: "0123456789")
}
if charSet.contains(.symbols) {
possibleCharacters.append(contentsOf: "!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~")
}
var password: [Character] = []
for _ in 0..<n {
password.append(possibleCharacters.randomElement()!)
}
return String(password)
}
}
var generator = PasswordGenerator()
generator.generate(n: 5)
generator.toggleOn(type: .uppercase)
generator.toggleOn(type: .symbols)
generator.toggleOn(type: .numbers)
generator.toggleOff(type: .symbols)
generator.generate(n: 10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment