Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用变量内容作为数组名称_Arrays_Swift - Fatal编程技术网

Arrays 使用变量内容作为数组名称

Arrays 使用变量内容作为数组名称,arrays,swift,Arrays,Swift,在swift 3.0中,我希望连接字符串(string1和string2),并使用结果字符串(string3)作为我要访问的数组的名称 let fruitsArray = ["apple", "orange", "banana"] let appleArray = ["red", "green", "yellow"] let string1 = "apple" let string2 = "Array" let string3 = string1 + string2 let string4

在swift 3.0中,我希望连接字符串(string1和string2),并使用结果字符串(string3)作为我要访问的数组的名称

let fruitsArray = ["apple", "orange", "banana"]
let appleArray = ["red", "green", "yellow"]

let string1 = "apple"
let string2 = "Array"
let string3 = string1 + string2

let string4 = string3[1]
当然,有一条错误消息“下标不可用…”
做这件事的正确方法是什么?非常感谢大家。

通过某种形式的内省,你可以得到你想要的,但这是一种糟糕的做法,而且非常笨拙。你应该重新设计你的数据,例如,使用字典:

let data = [
    "fruitsArray" : ["apple", "orange", "banana"],
    "appleArray": ["red", "green", "yellow"]
]

let string1 = "apple"
let string2 = "Array"
let string3 = string1 + string2

if let array = data[string3] {
    let string4 = array[1]
    print(string4)
} else {
    print("Key not found")
}

AS,您可能需要考虑重新建模数据,因为这种类型的运行时属性访问不是非常“快速”。 但是,如果您只对为了调试而读取数据感兴趣,那么可以利用该结构对拥有数组属性的数据类型执行运行时自省

例如:


当然,您可以将此方法应用于非调试目的,但我不推荐使用。

是的,我理解此方法,谢谢。但是有没有一种方法可以在不使用字典的情况下执行此操作?任何其他方法都要求您在类或结构中包装
futurarray
applarray
。如果您的包装类继承自
> NSObjult,你可以使用。如果你想要一个纯SWIFT解决方案,看看OK。非常感谢。如果你愿意的话,考虑反馈我提供的答案。
struct Foo {
    let fruitsArray = ["apple", "orange", "banana"]
    let appleArray = ["red", "green", "yellow"]
}

func attemptToReadStringArrayProperty(_ name: String, fromFoo foo: Foo) -> [String]? {
    return Mirror(reflecting: foo).children
        .flatMap { ($0 ?? name + ".") == name ? ($1 as? [String]) : nil }.first
}

/* example usage/debugging */
let string1 = "apple"
let string2 = "Array"
let string3 = string1 + string2
let foo = Foo()

if let strArr = attemptToReadStringArrayProperty(string3, fromFoo: foo) {
    strArr.forEach { print($0) }
} /* red
     green
     yellow */