Swift 斯威夫特:为什么';我不能在这里加两个整数吗?
我是斯威夫特的新手。我在Xcode中使用Swift 3.x。在努力从一个出口获取信息后,我终于克服了大部分错误,现在我遇到了有史以来最奇怪的事情。我怎么能不求2个整数的和 目标:与Swift/XCode进行蒙特卡罗集成。 伪代码:Swift 斯威夫特:为什么';我不能在这里加两个整数吗?,swift,integer,Swift,Integer,我是斯威夫特的新手。我在Xcode中使用Swift 3.x。在努力从一个出口获取信息后,我终于克服了大部分错误,现在我遇到了有史以来最奇怪的事情。我怎么能不求2个整数的和 目标:与Swift/XCode进行蒙特卡罗集成。 伪代码:I=(区间)*(1/抽样)*和[f(x)](从n=1到n=抽样) 守则: @IBOutlet weak var interval_a: NSNumber! @IBOutlet weak var interval_b: NSNumber! @IBOutlet weak v
I=(区间)*(1/抽样)*和[f(x)](从n=1到n=抽样)
守则:
@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
}
我发现,Swift错误消息可能毫无价值,甚至具有误导性。忽略特定消息。你必须自己找出问题所在
如果
c
、rand\u numb
和interval\u a\u int
都是类型int
,那么您的代码应该编译。我尝试了不同类型的这些值的各种排列,但无法获得您显示的错误消息,但当它们都是类型Int
时,它会编译。仔细检查所有3个变量/常量的类型。我发现Swift错误消息可能毫无价值,甚至会产生误导。忽略特定消息。你必须自己找出问题所在
如果
c
、rand\u numb
和interval\u a\u int
都是类型int
,那么您的代码应该编译。我尝试了不同类型的这些值的各种排列,但无法获得您显示的错误消息,但当它们都是类型Int
时,它会编译。仔细检查所有3个变量/常量的类型。其他人怎么说,这个消息有点棘手
两个UInt32之和将生成另一个UInt32。不能将其分配给Int变量
更改变量的类型,或强制转换求和结果
就你而言:
rand_numb = Int(arc4random_uniform(UInt32(c))) + interval_a_int
其他人怎么说,这个信息有点棘手 两个UInt32之和将生成另一个UInt32。不能将其分配给Int变量 更改变量的类型,或强制转换求和结果 就你而言:
rand_numb = Int(arc4random_uniform(UInt32(c))) + interval_a_int
这有点晚了,考虑到这个问题的优雅答案,我将他的Int扩展名转换为Swift 3:
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
}
}
这有点晚了,考虑到这个问题的优雅答案,我将他的Int扩展名转换为Swift 3:
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
}
}
请发布代码(一个独立的可复制示例),而不是屏幕截图。您正在将
C
转换为UInt32
,然后尝试将其转换为常规整数。删除UInt32
,它应该会修复它,您不需要强制转换为int。还要确保rand_num
声明为var
而不是let
为什么您的三个NSNumber
属性设置为outlet?为什么它们很弱?@rmaddy为什么我不能在那里使用NSNumber
?我没有质疑NSNumber
的使用。我质疑它们为什么是出口和薄弱环节。请发布代码(一个独立的可复制示例),而不是屏幕截图。您正在将C
转换为UInt32
,然后尝试将其转换为常规整数。删除UInt32
,它应该会修复它,您不需要强制转换为int。还要确保rand_num
声明为var
而不是let
为什么您的三个NSNumber
属性设置为outlet?为什么它们很弱?@rmaddy为什么我不能在那里使用NSNumber
?我没有质疑NSNumber
的使用。我质疑它们为什么是出口和薄弱环节。问题是,行rand\u numb=arc4random\u uniform(c)+interval\u a\u int
抛出了一个错误,指出c
必须是UInt32
-这就是我这样做的原因。问题是行rand\u numb=arc4random\u uniform(c)+interval_a_int
抛出一个错误,指出c
必须是UInt32
类型-这就是我这样做的原因。