How to access a property or method from a variable?

Is it possible to access a method or property using a variable as the name of a method or property in Swift?

In PHP, you can use $ object β†’ {$ variable}. for example

class Object { public $first_name; } $object = new Object(); $object->first_name = 'John Doe'; $variable = 'first_name'; $first_name = $object->{$variable}; // Here we can encapsulate the variable in {} to get the value first_name print($first_name); // Outputs "John Doe" 

EDIT:

Here is the actual code I'm working with:

 class Punchlist { var nid: String? var title: String? init(nid: String) { let (result, err) = SD.executeQuery("SELECT * FROM punchlists WHERE nid = \(nid)") if err != nil { println("Error") } else { let keys = self.getKeys() // Get a list of all the class properties (in this case only returns array containing "nid" and "title") for row in result { // Loop through each row of the query for field in keys { // Loop through each property ("nid" and "title") // field = "nid" or "title" if let value: String = row[field]?.asString() { // value = value pulled from column "nid" or "title" for this row self.field = value //<---!! Error: 'Punchlist' does not have a member named 'field' } } } } } // Returns array of all class properties func getKeys() -> Array<String> { let mirror = reflect(self) var keys = [String]() for i in 0..<mirror.count { let (name,_) = mirror[i] keys.append(name) } return keys } } 
+7
ios swift
source share
2 answers

You can do this, but not use a clean Swift. The whole point of Swift (as a language) is to prevent such dangerous dynamic access to properties. You will need to use Cocoa Key-Value Coding :

 self.setValue(value, forKey:field) 

It’s very convenient, and it crosses the bridge with the names of the lines and properties that you want to cross, but be careful: here are the dragons.

(But it would be better, if possible, to redefine your architecture as a dictionary. The dictionary has arbitrary string keys and corresponding values, and therefore there is no bridge crossing.)

+7
source share

Subscribers can help you.

 let punch = Punchlist() punch["nid"] = "123" println(punch["nid"]) class Punchlist { var nid: String? var title: String? subscript(key: String) -> String? { get { if key == "nid" { return nid } else if key == "title" { return title } return nil } set { if key == "nid" { nid = newValue } else if key == "title" { title = newValue } } } } 
+8
source share

All Articles