当尝试使用 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
}
那行得通。Edit:它有效,但每次都给我相同的数字:(
- 当尝试生成随机字母数字字符串时,我仅限于使用 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 中运行该函数时,该函数实际上可以工作
沙箱
and I'm assuming its using linux also. Im very stuck and confused any help would be greatly appreciated.
(UPDATE):我在 Linux 环境中使用单个 swift 文件运行了相同的函数,而不是 Vapor swift Web 框架。它有效。正如我在上面的编辑中提到的,它每次都会给我相同的随机字符串。构建完成后,我仍然需要测试整个项目。但除此之外,我需要知道 random() 函数是否真的每次都会给我一些新的东西,而不是同样的垃圾。