2016-07-22 51 views
0

我最近想编写一个平均计算器。 我的计划是建立一个UITextField,您可以在其中输入以逗号分隔的数字......通过按'计算'按钮,应用程序应该计算上述数字的平均值,并通过将标签文字设置为平均值来给出它们。 所以我写了我的平均功能,收到此错误信息:Textfield作为平均函数的输入

无法将类型的价值“的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)'。你现在正在指定textfield对象加倍 –

回答

2

请使用较低的骆驼情况变量...

在这一行:

var grades:[Double] = [Input] 

InputUITextField一个实例,所以你想一个单元素Array<UITextField>分配给Array<Double>。你看你不能做这样的事情。

如果要接受包含的文本,请用逗号分隔,则需要将text明确转换为[Double]

为了简化,我们忽略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)" 
} 

这一行的基本思路:在Lu_的答案

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

是很好的描述。我的只是一个更安全的版本。


(加) 关于安全的一些说明:

UITextField财产textString?类型的,所以你应该认为它可以是零。使用??运算符为零提供默认值。

而使用Double($0)!可能会导致您的应用程序崩溃,因为Double($0)将针对非数字字符串返回nil。

写这些让我想起了另一个崩溃案例。

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

您需要做的是使用Double(Input.text)而不是[Input]。现在,您试图将UITextField转换为double,这会导致错误。

4

你需要单独的数字,如果你这样做,以获得该数组: enter image description here

,你可以通过“双打”阵列一般的功能

代码copypaste :)

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

这里是如果有人有兴趣:)

@IBOutlet var input: UITextField! 
@IBOutlet var output: UILabel! 
@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" 
    } 

} 

@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true) 
} 

我增加了行@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true) }关闭输入特克斯完整代码tField当你点击计算...