如何使Swift 3识别一个不断增加的文本字段名?
我有26个文本字段,每个字段将提供不同的浮点值,我想创建一个循环,使将这些值添加到单个变量中变得更容易、更快 我的文本字段名为a1,a2。。。所以唯一改变的是a后面的数字。在增加变量“x”时,如何使swift识别文本字段名称 我是这样想的:如何使Swift 3识别一个不断增加的文本字段名?,swift,macos,Swift,Macos,我有26个文本字段,每个字段将提供不同的浮点值,我想创建一个循环,使将这些值添加到单个变量中变得更容易、更快 我的文本字段名为a1,a2。。。所以唯一改变的是a后面的数字。在增加变量“x”时,如何使swift识别文本字段名称 我是这样想的: var x : Int = 1 var total : Float = 0; var y : Float = 0; while (x == 26) { y = a/(x).floatValue;
var x : Int = 1
var total : Float = 0;
var y : Float = 0;
while (x == 26) {
y = a/(x).floatValue;
total += y;
x+=1;
}
我的想法显然行不通创建一个包含所有26个文本字段的数组,并对其进行迭代:
let textfields = [a1, a2, ..., a26]
for textfield in textfields {
total += textfield.floatValue
}
我同意@jtbandes的评论,即最好从数组和循环开始,因此您永远不需要所有26个变量都是单独的变量。如果您的文本字段是
@IBOutlet
s,则可以使用outlet集合(它只是一个数组,用于保存所有文本字段)
然后你只需做:
for textfield in textfields {
total += textfield.floatValue
}
为了显示可能的情况,假设textfields是类的属性(并且类派生自
NSObject
),可以使用键值编码来获取值:
for i in 1...26 {
if let tf = value(forKey: "a\(i)") as? NSTextField {
total += tf.floatValue
}
}
macOS的完整示例:
import Cocoa
class ViewController: NSViewController {
var a1 = NSTextField()
var a2 = NSTextField()
var a3 = NSTextField()
func total() {
// give them some values for testing purposes
a1.stringValue = "1.2"
a2.stringValue = "2.3"
a3.stringValue = "3.14"
var total: Float = 0.0
for i in 1...3 {
if let tf = value(forKey: "a\(i)") as? NSTextField {
total += tf.floatValue
}
}
print(total)
}
}
ViewController().total() // 6.64
import UIKit
class ViewController: UIViewController {
var a1 = UITextField()
var a2 = UITextField()
var a3 = UITextField()
func total() {
// give them some values for testing purposes
a1.text = "1.2"
a2.text = "2.3"
a3.text = "3.14"
var total: Float = 0.0
for i in 1...3 {
if let tf = value(forKey: "a\(i)") as? UITextField {
total += ((tf.text ?? "") as NSString).floatValue
}
}
print(total)
}
}
ViewController().total() // 6.64
iOS的完整示例:
import Cocoa
class ViewController: NSViewController {
var a1 = NSTextField()
var a2 = NSTextField()
var a3 = NSTextField()
func total() {
// give them some values for testing purposes
a1.stringValue = "1.2"
a2.stringValue = "2.3"
a3.stringValue = "3.14"
var total: Float = 0.0
for i in 1...3 {
if let tf = value(forKey: "a\(i)") as? NSTextField {
total += tf.floatValue
}
}
print(total)
}
}
ViewController().total() // 6.64
import UIKit
class ViewController: UIViewController {
var a1 = UITextField()
var a2 = UITextField()
var a3 = UITextField()
func total() {
// give them some values for testing purposes
a1.text = "1.2"
a2.text = "2.3"
a3.text = "3.14"
var total: Float = 0.0
for i in 1...3 {
if let tf = value(forKey: "a\(i)") as? UITextField {
total += ((tf.text ?? "") as NSString).floatValue
}
}
print(total)
}
}
ViewController().total() // 6.64
创建一个包含所有26个文本字段的数组,并对其进行迭代。更好的是,从数组和循环开始,这样您就不需要将所有26个字段都作为单独的变量。
let total=textFields.reduce(0){v,v中的textField+textField.text.floatValue}
isSwiftier@EmilioPelaez是 啊但我故意反对它:1)我决定它可能会领先于OPs级别2)如果total
是ivar,使用reduce不会给你带来太多好处。它仍然必须是可变的