我有一个文本字段和一个生成随机字符集的按钮。设置1 =小写,设置2 =大写,设置3 =数字,设置4 =符号
我希望按钮不再生成不少于10个字符,并且每个集合至少拉一次。
到目前为止,我对如何做到这一点的想法是
let roomIDGenerated = uniqueRoomID.text
let roomIDCount = roomIDGenerated?.characters.count
let randomCharacterSet = arc4random() upp
while roomIDCount < 10 {
<#code#>
}
但是我不知道该怎么做...我并不总是希望前4个字符始终是每个字符中的一个......可能最后使用了一个必需的字符。
我总体上被困住了,任何帮助都会受到赞赏
答案 0 :(得分:1)
马丁用我采取的相同方法评论。这是我的实施:
extension CollectionType {
var random: Generator.Element {
guard !isEmpty else { fatalError("array cannot be empty") }
let array = Array(self)
return array[Int(arc4random_uniform(UInt32(array.count)))]
}
}
// from http://stackoverflow.com/a/24029847/1223781
extension MutableCollectionType where Index == Int {
func shuffled() -> Self {
var copy = self
copy.shuffle()
return copy
}
mutating func shuffle() {
guard count >= 2 else { return }
for i in 0..<count - 1 {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
let sets = ["abc", "ABC", "123", "#$%"].map { Array($0.characters) }
let size = 10
var randoms = sets.map { $0.random }
while randoms.count < 10 {
randoms.append(sets.random.random)
}
print(randoms.shuffled()) // ["b", "b", "3", "c", "#", "%", "A", "#", "1", "%"]