给定一个构造函数,例如:
required init (pTableName : String, pRecordKey : String, pStartAtRecord : Int){
parameters.append(ChildElement(identifier: "pTableName", value: pTableName))
parameters.append(ChildElement(identifier: "pRecordKey", value: pRecordKey))
parameters.append(ChildElement(identifier: "pStartAtRecord", value: pStartAtRecord))
}
我想提取所有参数变量的名称,例如 pTableName、pRecordKey 等。究竟为什么?首先,我可能有超过 30 个不同的类,它们具有不同的构造函数参数,并将它们传递到参数数组中。其次,所有构造函数都有不同的签名,但主要是它们执行相同的操作 - 创建 ChildElement 并将它们附加到参数列表中 - 随后构成对 Web 服务的 SOAP 请求。
通过获取变量名称的能力(例如 pTableName 应该生成 "pTableName" : String),我想完成以下任务:
required init (pTableName : String, pRecordKey : String, pStartAtRecord : Int){
appendToParameters([pTableName, pRecordKey, pStartAtRecord])
}
然后对于数组的每个元素都会产生:
parameters.append(ChildElement(identifier: Reflection.getName(var), value : var))
而 ChildElement 类的结构等于:
class ChildElement : Element {
var attributes : [String : String] = [:]
var identifier : String
var value : AnyObject
var toString : String {
return "<\(identifier) \(self.concatinateAttributesAsString())>\(value)</\(identifier)>"
}
required init (identifier : String, value : AnyObject) {
self.identifier = identifier
self.value = value
}
然而,在 Swift 中,不可能使用反射和宏(例如 Objective-C 中使用的宏)来获取变量名称:
#define variableName(var) [NSString stringWithFormat:@"%s",#var]
如果我尝试通过 Objective C 方法使用宏,然后在 Swift 中应用:
-(NSString *)getVarName:(id)var {
return variableName(var)
}
那么返回的 NSString 值当然将等于“var”。
一般来说,如何在 Swift 中使用反射来获取参数变量的名称(如本例所示)?到目前为止,我已经检查了许多资源,从 Apple 的文档到运行时 API 等,但不幸的是,没有一个预定义的运行时方法似乎适用于 Swift。