我试图编写一个返回第n个素数的Swift 3.0方法。存在other sources for this problem但这些都是在Swift 3.0发布之前编写的,因此代码不会随之而来。在我的回复声明中return prime
我收到错误说
变量'素数'在初始化之前使用
这是我的源代码:
func nthPrimeNumber(_ n: Int) -> Int {
var prime: Int
var modulo: Int
var checkPrime: Bool
var count = 0
for prime in stride(from: 2, to: 50, by: 1)
{
if (count < n){
checkPrime = true;
for modulo in stride(from: 2, to: prime, by: 1)
{
if ((prime % modulo) == 0 )
{
checkPrime = false
}
}
if (checkPrime)
{
count += 1
}
}
}
return prime
}
答案 0 :(得分:2)
@ BenjaminLowry的更改将修复编译器警告,但算法仍然是错误的。这里的问题是函数使用的第一个prime
,for循环中使用的第二个prime
是自变量,因此for循环中使用的值不会影响您的结果,并且因此你的函数将始终返回0.相反,你需要做这样的事情:
func nthPrimeNumber(_ n: Int) -> Int {
var result: Int = 0
var checkPrime: Bool
var count = 0
for prime in stride(from: 2, to: 50, by: 1)
{
if (count < n){
checkPrime = true;
for modulo in stride(from: 2, to: prime, by: 1)
{
if ((prime % modulo) == 0 )
{
checkPrime = false
}
}
if (checkPrime)
{
count += 1
result = prime
}
}
}
return result
}
对modulo
的2次使用也是如此。外modulo
未使用,可以删除。
答案 1 :(得分:1)
prime
在初始化时需要有一个值,例如
var prime: Int = 0
否则编译器会抱怨,因为理论上如果if语句中的代码没有运行,那么prime
就没有值,然后返回。由于您返回的是非可选值Int
,因此无论如何都必须确保它具有值。