2017-02-07 8 views
0

私はSwiftを初めて使っています。 XcodeでSwift 3.xを使用しています。アウトレットからの入力を苦労した後、私は最終的にほとんどのエラーを解決することができました。そして今、私は今までにも一番奇妙なことに遭遇しました。どうすれば2つの整数を合計できないのですか?Swift:ここで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 

} 
+1

p ost * code *(自己完結型の再現可能な例)であり、スクリーンショットではありません。 –

+1

'C'を' UInt32'に変換してからそれを通常の整数に変換しようとしています。 'UInt32'を削除すれば修正され、intにキャストする必要はありません。 'rand_num'が' let'ではなく 'var'として宣言されていることも確認してください。 – KSigWyatt

+0

3つの' NSNumber'プロパティがアウトレットとして設定されているのはなぜですか?なぜ彼らは弱いのですか? – rmaddy

答えて

2

他の人が言っているように、メッセージは少しトリッキーです。

2つのUInt32の和は、別のUInt32を生成します。 Int変数に割り当てることはできません。

変数の型を変更するか、または合計結果をキャストします。あなたのケースでは

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

を見つけました。特定のメッセージは無視してください。あなたは何が間違っているのか把握しなければなりません。

c,rand_numbおよびinterval_a_intがすべてIntの場合は、コードをコンパイルする必要があります。私は、さまざまな種類のこれらの値のさまざまな置換を試して、あなたが表示されているエラーメッセージを得ることができませんでしたが、タイプIntの場合、コンパイルされます。それらの変数/定数の3つすべてのタイプを慎重にチェックしてください。

+0

問題は、 'rand_numb = arc4random_uniform(c)+ interval_a_int'行が、' c 'が 'UInt32'型でなければならないというエラーを投げるということです。 – whatin1992

+0

すべてのコードを投稿してください。 – whatin1992

0

これは少し遅れている、そしてこの質問にTed van Gaalen'sエレガントな解答に帰属を与え、私はスウィフト3に彼のIntの拡張子を変換:

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 
} 
関連する問題