我是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
}
答案 0 :(得分:2)
我发现Swift错误消息可能毫无价值,甚至可能会误导。忽略特定消息。你必须弄清楚自己出了什么问题。
如果c
,rand_numb
和interval_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
}
}