Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Swift代码与Java代码。Swift给出了一个错误,但是Java没有';T有什么不同吗?_Java_Swift_For Loop - Fatal编程技术网

我的Swift代码与Java代码。Swift给出了一个错误,但是Java没有';T有什么不同吗?

我的Swift代码与Java代码。Swift给出了一个错误,但是Java没有';T有什么不同吗?,java,swift,for-loop,Java,Swift,For Loop,所以我在写一个应用程序,可以找到一个数的主要因子。我正在用Swift编写应用程序,但如果我将“num”设置为偶数而不是奇数,则会出现错误。错误显示,执行被中断,原因:第5行代码上的EXC_BAD_指令代码=EXC_l386_INVOP,子代码=0x0 以下是Swift代码: var num = 16 for i in 2...(num/2)-1 { if ((num % i) == 0) { var isPrimeFactor = true for

所以我在写一个应用程序,可以找到一个数的主要因子。我正在用Swift编写应用程序,但如果我将“num”设置为偶数而不是奇数,则会出现错误。错误显示,
执行被中断,原因:第5行代码上的EXC_BAD_指令代码=EXC_l386_INVOP,子代码=0x0

以下是Swift代码:

var num = 16

for i in 2...(num/2)-1 {

    if ((num % i) == 0) {
        var isPrimeFactor = true

        for l in 2...i-1 {
            if ((i%l) == 0) {
                isPrimeFactor = false;
            }//end if
        }//end for

        if (isPrimeFactor == true) {
            i
        }//end if

    }//end if

}//end for
int num = 16;

for (int i=2; i<num/2; i++) {
    if (num%i == 0) {
        boolean isPrimeFactor = true;

        for (int l=2; l<i; l++) {
            if ((i%l) == 0) {
                isPrimeFactor = false;
            }
        }

        if (isPrimeFactor == true) {
            System.out.println(i);
        }
    }
}
以下是Java代码(我认为它是Swift代码的精确副本):

int num=16;

对于(int i=2;i您永远不应该比较布尔类型是否为==true。如果(isPrimeFactor==true)是冗余的

 if isPrimeFactor { ... } else {...}
您可以创建一个只读计算属性,以返回一个Bool值,指示一个数字是否为素数,如下所示:

extension Int {
    var isPrime:Bool{
        if self <  2 { return false }
        let squareRoot = Int(sqrt(Double(self)))
        if squareRoot * squareRoot == self { return false }
        for i in 2..<Int(ceil(sqrt(Double(self)))) {
            if self % i == 0 { return false }
        }
        return true
    }
}

1.isPrime   // false
2.isPrime   // true
3.isPrime   // true
4.isPrime   // false
5.isPrime   // true
6.isPrime   // false
7.isPrime   // true
8.isPrime   // false
9.isPrime   // false
10.isPrime   // false
11.isPrime   // true

let myInt = 7

if myInt.isPrime {
    // do this
} else {
    // do that
}

如果布尔类型为==true,则不应进行比较。如果(isPrimeActor==true)是冗余的,则不应进行比较

 if isPrimeFactor { ... } else {...}
您可以创建一个只读计算属性,以返回一个Bool值,指示一个数字是否为素数,如下所示:

extension Int {
    var isPrime:Bool{
        if self <  2 { return false }
        let squareRoot = Int(sqrt(Double(self)))
        if squareRoot * squareRoot == self { return false }
        for i in 2..<Int(ceil(sqrt(Double(self)))) {
            if self % i == 0 { return false }
        }
        return true
    }
}

1.isPrime   // false
2.isPrime   // true
3.isPrime   // true
4.isPrime   // false
5.isPrime   // true
6.isPrime   // false
7.isPrime   // true
8.isPrime   // false
9.isPrime   // false
10.isPrime   // false
11.isPrime   // true

let myInt = 7

if myInt.isPrime {
    // do this
} else {
    // do that
}

不,苹果并没有摆脱in
循环的

你的问题是,那句话:

 for l in 2...i-1 {
因为如果
i-1
小于2,则会发生此错误。因此,如果i-1等于或大于2,则需要进行检查。检查此代码以证明错误:

for l in 2...2 { //No error
for l in 2...1 { //error
如果你想保留你的代码,我会这样做:

if(i-1 >= 2){
    for a in 2...i-1 {
        if ((i%a) == 0) {
            isPrimeFactor = false
        }//end if
    }//end for
}
这里还有一个错误:

 if (isPrimeFactor == true) {
            i
        }//end if

您需要将i包装成一个
println(i)
,或者删除它。

不,苹果没有为in
循环去掉

你的问题是,那句话:

 for l in 2...i-1 {
因为如果
i-1
小于2,则会发生此错误。因此,如果i-1等于或大于2,则需要进行检查。检查此代码以证明错误:

for l in 2...2 { //No error
for l in 2...1 { //error
如果你想保留你的代码,我会这样做:

if(i-1 >= 2){
    for a in 2...i-1 {
        if ((i%a) == 0) {
            isPrimeFactor = false
        }//end if
    }//end for
}
这里还有一个错误:

 if (isPrimeFactor == true) {
            i
        }//end if

您需要将i包装成
println(i)
或将其删除。

您应该使用
2..
而不是
2…i-1

2..<2
会生成空序列,而
2…1
会导致错误

您可以像这样简化代码

OUTER: for i in 2 ... (num / 2) {
    if (num % i) == 0 {

        for l in 2 ..< i {
            if (i % l) == 0 {
                continue OUTER
            }
        }

        println(i)
    }
}
OUTER:对于2中的i…(num/2){
如果(数量%i)==0{
对于2中的l..
您应该使用
2..
而不是
2…i-1

2..<2
会生成空序列,而
2…1
会导致错误

您可以像这样简化代码

OUTER: for i in 2 ... (num / 2) {
    if (num % i) == 0 {

        for l in 2 ..< i {
            if (i % l) == 0 {
                continue OUTER
            }
        }

        println(i)
    }
}
OUTER:对于2中的i…(num/2){
如果(数量%i)==0{
对于2中的l..
你能解释一下这是什么以及如何使用它吗?哇。这真的很酷!你介意把代码分解一下吗?你不明白哪一部分?这是因为你不需要检查数字本身的平方根以上的数字。这将节省你大量的处理时间。sqrt函数需要一个双精度参数,所以我只需要转换插入整数(self)翻倍。哦,好的。这对我有很大帮助!谢谢!你能解释一下这是什么以及如何使用它吗?哇。那真的很酷!你介意把代码分解一下吗?你不明白哪一部分?这是因为你不需要检查数字本身的平方根以上的数字。这将节省你处理它的大量时间。sqrt函数需要一个Double作为参数,所以我只需将整数(self)转换为Double。哦,好的。这将对我有很大帮助!谢谢!您的问题是,在第一次出现错误的循环中,I-1小于2。因此代码崩溃。(查看我的答案了解更多信息)它看起来更干净,不是吗?还有一件事。当我使用上面的代码时..对不起,我不明白。当使用0..是的,但是这样如果我是2,它仍然会运行。你的问题是,在第一次出现错误的循环中,i-1小于2。因此代码崩溃。(查看我的答案了解更多信息)它看起来更干净,不是吗?还有一件事。当我使用上面的代码时..对不起,我不明白。当使用0..是的,但是这样如果我是2,它仍然会运行。哦,我明白了。所以我应该在那之前做一个if语句,说如果我!=2…没错。但是确保它也不是0。所以我会让它像如果我>=2.我将其添加到我的答案中,另一方面,Java将乐于接受for的
(int I=2;I<1;I++)
并执行它0次。如果i>2,不是吗?是的,你是对的。我犯了一个错误。我想如果i-1>=2。所以是的,它应该是i>2。哦,我明白了。所以我应该在那之前做一个if语句,说如果i!=2……没错。但是确保它也不是0。所以我会把它当作如果i>=2。我把它添加到我的答案中,另一方面d、 Java会很高兴地接受(inti=2;i<1;i++)的
,并执行它0次。如果i>2,不是吗?是的,你是对的。我犯了一个错误。我想如果i-1>=2。所以是的,它应该是i>2。