如何在 Swift 中创建 15 位长度的随机字符串?

How to create 15 digit length random string in Swift?

在Javascript中,Node.js我可以用https://www.npmjs.com/package/uuid包生成一个15位长度的"random"字符串。 Swift 可以吗?

像这样:802128100247740

const uuidv4 = require("uuid/v4");
tempUserUuid = uuidv4();

Swift 5.0 在处理随机值和元素方面引入了重大改进。下面的代码可以帮到你

func randomString(length: Int) -> String {
  let letters = "0123456789"
  return String((0..<length).map{ _ in letters.randomElement()! })
}

label.text = randomString(length: 15)
func randomString(length: Int) -> String {
    return (0..<length).map { _ in String(Int.random(in: 0...9)) }.joined()
}

func randomStringBuffer(length: Int) -> String {
    var buffer = ""
    (0..<length).forEach { _ in buffer += String(Int.random(in: 0...9)) }
    return buffer
}

print(randomString(length: 15))
print(randomStringBuffer(length: 15))

第一个是紧凑的,第二个效率更高,但在这种情况下(只生成15位数字的字符串)没关系,我认为

UPD 我做了一个测试,它说我错了。似乎是第一种方法,joined() 更好

let a = Date().timeIntervalSince1970
print(a)
let g = randomString(length: 10000)
let b = Date().timeIntervalSince1970
print(b)
print(b - a)



let c = Date().timeIntervalSince1970
print(c)
let f = randomStringBuffer(length: 10000)
let d = Date().timeIntervalSince1970
print(d)
print(d - c)
1583933185.788064
1583933185.9271421
0.13907814025878906 // joined() version
1583933185.927207
1583933186.2418242
0.3146171569824219 // buffer version

UPD 2 还使用@deep-kakkar 函数制作了一个 public gist。 如我所见,“joined()”方法使其最有效

其他答案会多次生成一个随机数,但您只需要做一次。

import Foundation

extension String {
  /// A leading-zero-padded padded random number.
  /// - Returns: nil if digitCount is too big for `UInt` (You get 19 or fewer!)
  static func randomNumber(digitCount: Int) -> Self? {
    let digitCountDouble = Double(digitCount)

    guard digitCountDouble < log10( Double(UInt.max) ) else {
      return nil
    }

    let formatter = NumberFormatter()
    formatter.minimumIntegerDigits = digitCount
    let upperBound = pow(10, digitCountDouble)
    return formatter.string(
      for: UInt.random( in: 0..<UInt(upperBound) )
    )!
  }
}