如何以正确的方式更新数组中的所有项目

Ula*_*Ula 2 arrays items insert-update ios swift

有货币汇率的数组,并且在inputTextField中输入了金额之后,我想更新此货币上的该数组中的所有项目,并将该货币放在tableView中,尝试使用循环来执行此操作,但这不能正常工作,因为这是解决方案刚刚放在表中的每个循环

inputTextField是文本字段的名称

receivedRates:[Double] = [1.1,1.6,2.0,1.3] // just example of the rates

for i in receivedRates {

    let newValue = Double(i)*Double(Int(inputTextField.text!)!)
    currentAmount.append(newValue)
    receivedRates = currentAmount
}
Run Code Online (Sandbox Code Playgroud)

如何不循环地更新此数组,或者可能对此循环有其他解决方案?

vad*_*ian 7

您想使用文本字段的double值来覆盖数组中的所有项目。

在Swift中一个非常合适的方法是 map

var receivedRates = [1.1, 1.6, 2.0, 1.3]

receivedRates = receivedRates.map{ $0 * Double(inputTextField.text!)! }
Run Code Online (Sandbox Code Playgroud)

或者,您可以枚举索引并在适当的位置更新值

receivedRates.indices.forEach{ receivedRates[$0] *= Double(inputTextField.text!)! }
Run Code Online (Sandbox Code Playgroud)

我怀疑您是否真的要先将文本转换为Int(丢失小数部分),然后再转换为Double,当然您应该安全地打开可选选项。


Leo*_*bus 5

您还可以扩展MutableCollection和实现您自己的可变映射方法来转换您的数组:

extension MutableCollection {
    mutating func mutableMap(_ transform: (Element) throws -> Element) rethrows {
        var index = startIndex
        for element in self {
            self[index] = try transform(element)
            formIndex(after: &index)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var receivedRates = [1.1, 1.6, 2.0, 1.3]
receivedRates.mutableMap { $0 * 2.5 }
print(receivedRates)    // [2.75, 4, 5, 3.25]
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

if let value = Double(inputTextField.text!) {
    receivedRates.mutableMap { $0 * value }
}
Run Code Online (Sandbox Code Playgroud)