Swift:为什么我不能在这里添加2个整数?

时间:2017-02-07 23:00:27

标签: swift integer

我是Swift的新手。我在Xcode中使用Swift 3.x.在努力从插座中获取输入之后,我终于设法解决了大部分错误,现在我遇到了最奇怪的事情。我怎么能不加2个整数?

目标:蒙特卡洛与Swift / XCode集成。 伪代码:I = (interval) * (1/SampleSize) * Sum[f(x)] (from n=1 to n=SampleSize)

代码:

@IBOutlet weak var interval_a: NSNumber!
@IBOutlet weak var interval_b: NSNumber!
@IBOutlet weak var sample_size: NSNumber!


@IBAction func calcMCIntegration(_ sender: Any) {

    let interval_a_int: Int = interval_a.intValue
    let interval_b_int: Int = interval_b.intValue
    let sample_size_int: Int = sample_size.intValue
    var c: Int = 0
    var mc_int: Double = 0.0
    var rand_numb: Int = 0
    var func_sum: Int = 0       

    c = interval_b_int - interval_a_int

    for i in 1...sample_size_int {

        rand_numb = arc4random_uniform(UInt32(c)) + UInt32(interval_a_int)

        function_val = exp(rand_numb)

        func_sum += function_val

    }

    mc_int = c*func_sum/sample_size

    return mc_int

}

3 个答案:

答案 0 :(得分:2)

我发现Swift错误消息可能毫无价值,甚至可能会误导。忽略特定消息。你必须弄清楚自己出了什么问题。

如果crand_numbinterval_a_int都是Int类型,那么您的代码应该编译。我尝试了各种不同类型的值的各种排列,但无法得到您显示的错误消息,但当所有 类型Int时,它会编译。仔细检查所有这3个变量/常数的类型。

答案 1 :(得分:2)

别人怎么说,这个消息有点棘手。

两个UInt32的总和将生成另一个UInt32。您不能将其分配给Int变量。

更改变量的类型,或转换总和结果。

在你的情况下:

 rand_numb = Int(arc4random_uniform(UInt32(c))) + interval_a_int

答案 2 :(得分:0)

这有点晚了,并且给了Ted van Gaalen's这个问题的优雅答案,我将他的Int扩展转换为Swift 3:

0xf0000000

实际使用的变化超过了扩展名,但在这种情况下,它将是:

extension Int {
    static func random(_ range: Range<Int> ) -> Int
    {
        var offset = 0

        if range.lowerBound < 0   // allow negative ranges
        {
            offset = abs(range.lowerBound)
        }

        let mini = UInt32(range.lowerBound + offset)
        let maxi = UInt32(range.upperBound   + offset)

        return Int(mini + arc4random_uniform(maxi - mini)) - offset
    }
}