我可以动态引用数组来执行数学函数吗?

Can I reference an array dynamically to perform a math function?

我有 18 个静态数组,每个数组有 18 个值。

我试着将它们塞进一个巨大的二维数组,但每次都会使编译器崩溃。

我已经意识到数据太多了,但我需要这些值中的每一个来计算一系列复杂的方程式。

我需要这样做更有效率,因为我将不得不多次这样做。

如果我可以编写代码来动态选择一个数组,这会很容易。

一个 2 组件选择器用于 select 2 个值(18 个选择)。 这 18 个选择对应于 18 个数组中的 18 个值。 我需要动态获取的数组由第二个组件 (1) aka choice2 决定。

choice1 = picker.selectedRowInComponent(0)
choice2 = picker.selectedRowInComponent(1)

用户选择要转换的值

numberToConvert = 345.0

下面是数组的示例:

let factorArray0 = [0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764]
let factorArray1 = [0.3544, 0.2053, 0.5854, 0.7452, 0.2379, 0.3042, 0.3595, 0.4101, 0.4438, 0.5098, 0.6448, 0.5165, 0.8691, 1.0000, 1.1354, 1.3688, 1.6125, 1.7446]
let factorArray2 = [0.6544, 0.1033, 0.7854, 0.2452, 0.2375, 0.3022, 0.3525, 0.4701, 0.5038, 0.5011, 0.6488, 0.9165, 0.8291, 1.0000, 1.0354, 1.3388, 1.3125, 1.7166]

等....总共18个不同的数组 这是我目前用来完成工作的方法:

var conversionFactor:Double = 0.0000

if choice1 == 0 {
        conversionFactor = factorArray0[choice2]
    }else if choice1 == 1 {
        conversionFactor = factorArray1[choice2]
    }else if choice1 == 2 {
        conversionFactor = factorArray2[choice2]
    }else if choice1 == 3 {
        conversionFactor = factorArray3[choice2]
    }else if choice1 == 4 {
        conversionFactor = factorArray4[choice2]
    }else if choice1 == 5 {
        conversionFactor = factorArray5[choice2]
    }
//and so on.... if statement for every index 0-17 (18 total values)

if 语句太长了。我有太多高效的编程,不知道任何长的东西都可能是错误的。如果我可以在数组中引用数组名称,我可以这样做:

let arrayOfArrays = [[factorArray1],[factorArray2],[factorArray3],[factorArray4],....[factorArray17]]
//**please imagine the above array is filled with contents of those arrays so I don't paste a gigantic array or arrays**
conversionFactor = arrayOfArrays[choice1][choice2]

这适用于填充整个小数组,但值太多,甚至无法编译。

最终成品为:

answer = conversionFactor * numberToConvert

提问:有没有人有更优雅的解决方案?我认为 enumerate 的某些东西可能会起作用,但无法完全想到如何。最后我需要使用 CoreData 但我正在寻找一个临时解决方案,因为我对如何获取和检索数据数组的所有搜索都没有成功。我正在学习的课程将教我 CoreData,但我有最后期限,所以我只需要一个临时解决方案或有人告诉我什么教程或 CoreData 的一部分可以帮助我。

首先,18 x 18 的数组并不大。它甚至都不大。事实上它很小!

你确实应该建立一个二维数组。

var conversions = [[Double]]

其次,你应该这样填写

conversions = [[1.1,1.2,1.3,....],[2.2,2.2,2.3],[....],...]

你所有的价值观。

那么你的函数应该是

func conversionFactor (choice1:Int,choice2:Int) -> Double {
    return conversions[choice1][choice2]
}

这是在全球范围内。您可能应该将其包装在 class

class Conversion {
    var conversions:[[Int]] = [[1.1,1.2,1.3,....],[2.2,2.2,2.3],[....],...]
    class func conversionFactor (choice1:Int,choice2:Int) -> Double {
        return conversions[choice1][choice2]
    }
}

let conversion = Conversion.conversionFactor(1,2)

您应该可以使用二维数组,18x18 不够大,不会引起问题。我自己检查了一下,编译正常:

import Foundation

let factorTable = [[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764],
[0.0595, 0.1682, 0.2668, 0.1075, 0.2711, 0.3479, 0.4099, 0.4285, 0.6767, 0.6486, 0.5290, 0.9579, 1.0000, 1.3147, 1.2999, 1.6438, 1.6542, 2.0764]
]

struct BigArrays {
    init() {
        let choice1 = 9
        let choice2 = 13
        print(factorTable[choice1][choice2])
    }
}