如何使Swift 3识别一个不断增加的文本字段名?

如何使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;

我有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;
        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不会给你带来太多好处。它仍然必须是可变的