如何修改iOS密码生成器代码,确保包含用户选中的所有属性?
解决iOS密码生成器无法包含所有选中属性的问题
你的问题核心在于当前代码只是从选中的字符池中随机选取字符,无法保证每个选中的属性类别都至少有一个字符出现。按照你提出的思路,我们可以修改fetchNewPassword函数,确保生成的密码必含所有选中属性:
修改后的完整代码
@IBOutlet weak var passwordField: UITextField! @IBOutlet weak var passwordLength: UILabel! @IBOutlet weak var uppercaseSwitch: UISwitch! @IBOutlet weak var lowercaseSwitch: UISwitch! @IBOutlet weak var numberSwitch: UISwitch! @IBOutlet weak var symbolSwitch: UISwitch! @IBOutlet weak var lenghtChanged: UISlider! @IBOutlet weak var generateButton: UIButton! @IBOutlet weak var saveButton: UIButton! var length: String = "" var password: String = "" var textField = UITextField() @IBAction func generateButtonPressed(_ sender: UIButton) { let generatedPassword = fetchNewPassword() self.password = generatedPassword passwordField.text = password } func fetchNewPassword() -> String { passwordField.text = "" let targetLength = Int(lenghtChanged.value) // 1. 收集所有选中的属性字符集 var selectedAttributeSets: [String] = [] if uppercaseSwitch.isOn { selectedAttributeSets.append(PasswordAttribute.uppercaseLetters.rawValue) } if lowercaseSwitch.isOn { selectedAttributeSets.append(PasswordAttribute.lowercaseLetters.rawValue) } if numberSwitch.isOn { selectedAttributeSets.append(PasswordAttribute.numbers.rawValue) } if symbolSwitch.isOn { selectedAttributeSets.append(PasswordAttribute.symbols.rawValue) } // 边界处理:如果没有选中任何属性,返回空字符串(可根据需求调整提示) guard !selectedAttributeSets.isEmpty else { return "" } // 2. 确保目标长度不小于选中属性的数量(避免长度不足无法覆盖所有属性) let validLength = max(targetLength, selectedAttributeSets.count) var passwordChars: [Character] = [] // 3. 从每个选中的属性中至少取一个字符,保证所有属性都被包含 for charSet in selectedAttributeSets { guard let randomChar = charSet.randomElement() else { continue } passwordChars.append(randomChar) } // 4. 拼接所有选中的字符集,用于生成剩余的随机字符 let combinedCharSet = selectedAttributeSets.joined() // 5. 生成剩余需要的字符 let remainingCount = validLength - selectedAttributeSets.count for _ in 0..<remainingCount { guard let randomChar = combinedCharSet.randomElement() else { continue } passwordChars.append(randomChar) } // 6. 打乱字符顺序,避免固定的属性排列 passwordChars.shuffle() return String(passwordChars) }
关键逻辑说明
- 收集选中属性集:不再直接拼接所有字符,而是单独存储每个选中的属性字符集,方便后续从每个集合取字符。
- 边界长度校验:如果用户设置的密码长度小于选中属性的数量(比如选了4个属性但设了3位长度),自动将长度调整为属性数量,确保每个属性至少有一个字符位置。
- 强制属性覆盖:先从每个选中的属性中随机选一个字符加入结果,直接保证所有选中属性都存在。
- 补全剩余字符:从合并后的字符池中随机选取剩余需要的字符,填充到目标长度。
- 打乱顺序:最后打乱整个字符数组,避免密码开头固定是各个属性的字符,提升随机性。
内容的提问来源于stack exchange,提问作者Asli Y
相关产品推荐
相关产品推荐

