我在试图使用Swift 3在Linux上生成随机字符串时遇到了两个问题。
arc4random_uniform is not available in Linux only on BSD. SO i was able to get away with using random() function. And this worked when i was generating random numbers of a variable size (See code below)
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文件和不使用Vapor Swift web框架的Linux环境下运行了相同的函数,也是有效的。如我上面的编辑所述,它每次都会给我相同的随机字符串。一旦我的构建完成,我仍然需要测试整个项目。除此之外,我需要知道random()函数是否会每次都给我新的内容而不是相同的垃圾。