是否可以使用变量作为
Swift中方法或属性的名称来访问方法或属性?
在PHP中,您可以使用$object-> {$variable}.例如
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"
编辑:
这是我正在使用的实际代码:
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 } }
解决方法
你可以做到,但不能使用“纯粹的”Swift. Swift(作为一种语言)的重点是防止这种危险的动态属性访问.你必须使用Cocoa的
Key-Value Coding功能:
self.setValue(value,forKey:field)
非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.
(但如果可能的话,最好将您的架构重新实现为字典.字典具有任意字符串键和相应的值,因此没有桥可以交叉.)