2016-07-22 1 views
0

私は最近、平均 - 電卓をコーディングしたかったのです。 UITextFieldを作成し、数値をカンマで区切って入力することができました。「計算」ボタンを押すと、上記の数値の平均を計算し、ラベルテキストを平均値に設定する必要があります。 だから、私は平均的な機能を書き、このエラーメッセージ受信:テキストフィールドの入力としての平均機能

が期待される要素タイプ「ダブル」にタイプ「のUITextField」の値を変換できません。

これは私のコードです:

@IBOutlet var Input: UITextField! 
@IBOutlet var Output: UILabel! 
@IBAction func Calculate(sender: AnyObject) { 

    var grades:[Double] = [Input] 
    func average(nums: [Double]) -> Double { 

     var total = 0.0 
     for grade in nums{ 

      total += Double(grade) 
     } 

     let gradesTotal = Double(nums.count) 
     let average = total/gradesTotal 
     return average 
    } 

    let Average = average(grades) 

    Output.text = "Average: \(Average)" 
} 

あなたは私の考えで私を助けることができますか? 入力を取得するより良い方法はありますか?

+0

'Double(Input.text)'を使用してください。あなたは現在、ダブルテキストフィールドオブジェクトを割り当てています –

答えて

2

変数には下のラクテルケースを使用してください...

この行の中:

var grades:[Double] = [Input] 

InputUITextFieldのインスタンスであるので、あなたはArray<Double>に単一要素Array<UITextField>を割り当てようとしています。そんなことはできませんね。

あなたはカンマで区切られた数字を含むテキストを受け入れるようにしたい場合は、明示的[Double]textを変換する必要があります。

簡略化するため、nilまたは数値以外の値を無視してみましょう。

@IBOutlet var input: UITextField! 
@IBOutlet var output: UILabel! 
@IBAction func calculate(sender: AnyObject) { 

    var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)} 
    func average(nums: [Double]) -> Double { 

     var total = 0.0 
     for grade in nums{ 

      total += Double(grade) 
     } 

     let gradesTotal = Double(nums.count) 
     let average = total/gradesTotal 
     return average 
    } 

    let averageValue = average(grades) 

    output.text = "Average: \(averageValue)" 
} 

このラインの基本的な考え方:

var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)} 

がLu_の答えに十分に記載され は、その後、あなたはあなたのようにコードを変更する必要があります。私のほうがもう少し安全なバージョンです。


(追加) 安全性に関するいくつかの説明:

UITextFieldのプロパティtextはタイプString?であるので、あなたはそれがnilことができると思うはずです。 ??演算子でnilのデフォルト値を与える。

Double($0)!を使用するとアプリがクラッシュする可能性があります。Double($0)は数値以外の文字列に対してはnilを返します。

これはもう1つのクラッシュケースを思い出させます。

gradesTotal == 0の場合、上記のコードはゼロ除算でクラッシュします。

default値は上記のコードでは、 "安全" ではうまく機能しません...)

ので、先の安全性への一歩:

@IBAction func calculate(sender: AnyObject) { 

    var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{ 
     Double($0.stringByTrimmingCharactersInSet(.whitespaceCharacterSet())) 
    } 
    func average(nums: [Double]) -> Double? { 

     var total = 0.0 
     for grade in nums{ 

      total += Double(grade) 
     } 

     let gradesTotal = Double(nums.count) 
     if gradesTotal > 0 { 
     let average = total/gradesTotal 
      return average 
     } else { 
      return nil 
     } 
    } 

    if let averageValue = average(grades) { 
     output.text = "Average: \(averageValue)" 
    } else { 
     output.text = "Average not available" 
    } 
} 
+0

ありがとうございました! それは働いた! :) – Cave007

+0

報告をいただきありがとうございます。 Stack Overflowコミュニティの協力を得てこの回答が改善されたことを覚えておいてください。あなたの経験が他のコミュニティメンバーに役立つことを願っています。あなたとあなたのアプリのために幸運。 – OOPer

+0

私は理由を知っていませんが、私は今すぐ起動するときにそれが壊れます @IBOutlet var input:UITextField! それは完全に機能しましたが、毎回壊れていることを知っています...私は何かを変更したとは思わない...私はコードを削除しても機能を持たないビューを拾うだけだが、それも壊れてしまった... – Cave007

0

あなたがしなければならないことは、[Input]の代わりにDouble(Input.text)を使用することです。今すぐ、UITextFieldをダブルに変換しようとしていましたが、エラーが発生します。

4

あなたはそれを行う場合には、その配列を取得するために数字を分離する必要があります。 enter image description here

を、あなたの平均的な機能へのコピー - ペーストする

コードを「ダブルス」配列を渡すことができます:)

var str = "1,2,3,4,5,6" 

let stringsWithNumbers = str.componentsSeparatedByString(",") 

let doubles = stringsWithNumbers.map { Double($0)! } 
+1

ニース!これは、問題の両方の問題に対処します。 – sbarow

+1

誤ってコメントを削除しました、申し訳ありませんが、引用したかっただけです。コードはそれを思い出させるために感謝してくれました。 –

+1

ようこそ。私は古いコメントをできるだけ早く解放しようとしています。 – vacawama

0
let textInput = txtInputView.text; 
let components = textInput.componentsSeparatedByString(","); 
let sum = 0.0; 
for txt in components 
{ 
    sum = sum + Double(txt); 
} 

let avg = sum/components.count; 
print(avg) 
0

はこちら誰かが興味があれば完全なコード:) @IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true) }入力Texを閉じるために行を追加しました。あなたが計算をタップすると、tField ...

関連する問題