2016-11-19 6 views
-2

In Swift 3.0 möchte ich Zeichenfolgen verketten (string1 & string2) und verwenden Sie die resultierende Zeichenfolge (string3) als Name des Arrays, auf das ich zugreifen möchte.Verwenden eines variablen Inhalts als Array-Name

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

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

let string4 = string3[1] 

Natürlich gibt es eine Fehlermeldung „Index ist nicht verfügbar ...) Was ist der richtige Weg, um all das? Vielen Dank an Sie tun.

+0

Wenn Sie möchten, können Sie eine Rückmeldung zu meiner Antwort geben. – dfri

Antwort

0

Was Sie wollen, ist möglich, eine Form mit der Selbstbeobachtung, aber es ist eine schlechte Praxis ist und extrem ungeschickt sowieso Sie sollten Ihre Daten umbauen, zum Beispiel ein Wörterbuch benutzen.

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

Ja, ich verstehe diese Methode, danke. Aber gibt es einen Weg, es ohne ein Wörterbuch zu tun? –

+0

Bei allen anderen Methoden müssen Sie 'fruitArray' und' appleArray' in einer Klasse oder Struktur umbrechen. Wenn Ihre Wrapper-Klasse von 'NSObject' erbt, können Sie [' value (forKey:) '] (https://developer.apple.com/reference/objectivec/nsobject/1412591-value) verwenden. Wenn Sie eine reine Swift-Lösung haben möchten, werfen Sie einen Blick auf [reflection] (http://shipster.com/mirrortype/) –

+0

OK. Vielen Dank. –

0

als @CodeDifferent writes in his/her answer, möchten Sie vielleicht die Umgestaltung Ihrer Daten, da diese Art von Laufzeit Eigenschaft accessi berücksichtigen ng ist nicht sehr "Swifty".

Wenn Sie nur zum Debuggen von Daten interessant sind, können Sie jedoch die Mirror-Struktur verwenden, um eine Laufzeit-Introspektion für den Datentyp durchzuführen, dem die Array-Eigenschaften gehören.

Z. B .:

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

natürlich Sie könnte anwenden, diesen Ansatz für nicht-Debugging-Zwecke, aber ich würde es nicht empfehlen.

Verwandte Themen