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

时间:2016-11-19 15:24:27

标签: 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 = string3[1]

当然有错误信息"下标不可用...) 这样做的正确方法是什么?非常感谢大家。

2 个答案:

答案 0 :(得分:0)

你想要什么是可能的使用某种形式的内省,但它是一个不好的做法,无论如何非常笨拙。您应该重新构建数据,例如,使用词典:

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")
}

答案 1 :(得分:0)

作为@CodeDifferent writes in his/her answer,您可能需要考虑重新构建数据,因为这种类型的运行时属性访问不是很快" Swifty"。

但是,如果您只是为了调试而只读取数据,那么您可以利用Mirror结构对拥有数组属性的数据类型执行运行时内省。

E.g:

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 */

当然,你可以将这种方法用于非调试目的,但我不推荐它。