在尝试使用 Swift 3 在 Linux 中生成随机字符串时,我遇到了 2 个问题。
arc4random_uniform 仅在 BSD 上的 Linux 中不可用。所以我能够摆脱使用 random() 函数。当我生成可变大小的随机数时,这很有效(见下面的代码)
func generateRandomNumber() -> Int { var place = 1 var finalNumber = 0; #if os(Linux) for _ in 0..<5 { place *= 10 let randomNumber = Int(random() % 10) + 1 finalNumber += randomNumber * place } #else for _ in 0..<5 { place *= 10 let randomNumber = Int(arc4random_uniform(10)) finalNumber += randomNumber * place } #endif return finalNumber }
这很有效。 编辑:它有效,但每次都给我相同的数字:(
- 在尝试生成随机字母数字字符串时,我仅限于使用 Swift String 而不是 NSSTRING。Linux 抛出此错误
原始的预 Linux 代码块:
func randomString(_ length: Int) -> String
{
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
以及我在使用上述代码时得到的实际错误
error: cannot convert value of type 'NSString' to type 'String' in coercion
randomString += NSString(characters: &nextChar, length: 1) as String
针对 linux 代码块进行了修改。
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(rand))])"
}
#endif
return randomString
}
但这次错误很奇怪,它只说 非法指令,没有额外信息。我以交互模式运行 docker 容器,并且在调用其他函数等时看到我的服务器正在运行并打印出来。
但问题是当我在 IBM 的 swift 沙箱中运行它时,该功能实际上是有效的
我假设它也使用linux。我非常困惑和困惑任何帮助将不胜感激。
(更新):我只在一个带有单个 swift 文件的 linux 环境中运行了相同的功能,而不是 Vapor swift Web 框架。它有效。正如我在上面的编辑中提到的,它每次都会给我相同的随机字符串。一旦我的构建完成,我仍然需要测试整个项目。但除此之外,我需要知道 random() 函数是否真的每次都会给我一些新的东西,而不是同样的废话。