【问题标题】:Swift: Why can't I add 2 integers here?斯威夫特:为什么我不能在这里添加 2 个整数?
【发布时间】:2017-02-07 23:00:27
【问题描述】:

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

目标:Monte Carlo 与 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

}

【问题讨论】:

  • 请发布代码(一个独立的可重现示例),而不是屏幕截图。
  • 您正在将C 转换为UInt32,然后尝试将其转换为常规整数。删除UInt32,它应该可以修复它,您不需要强制转换为int。还要确保 rand_num 被声明为 var 而不是 let
  • 为什么您的三个NSNumber 属性设置为网点?为什么他们很弱?
  • @rmaddy 为什么我不能在那里使用NSNumber
  • 我没有质疑NSNumber 的使用。我质疑为什么他们是出口和弱者。

标签: swift integer


【解决方案1】:

其他人怎么说,消息有点棘手。

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

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

在你的情况下:

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

【讨论】:

    【解决方案2】:

    我发现 Swift 错误消息可能毫无价值,甚至会产生误导。忽略特定消息。你必须自己找出问题所在。

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

    【讨论】:

    • 问题是rand_numb = arc4random_uniform(c) + interval_a_int 行抛出一个错误,指出c 必须是UInt32 类型——这就是我这样做的原因。
    【解决方案3】:

    这有点晚了,并且归因于 Ted van Gaalen's 这个问题的优雅答案,我将他的 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
        }
    }
    

    实际用法的变化比扩展更多,但在这种情况下,它会是:

    @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 = Int.random(Range(c...interval_a_int))
            function_val = exp(rand_numb)
            func_sum += function_val
        }
        mc_int = c*func_sum/sample_size
        return mc_int
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多