Учитывая конструктор, такие как:Возможности быстрого отражения - как получить имя переменной экземпляра?
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 разных классов, имеющих разные аргументы конструктора и передающие их в массив параметров. Во-вторых, все конструкторы имеют другую подпись, но в основном они делают то же самое - создайте ChildElements и добавьте их в список параметров, который впоследствии представляет собой запрос 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]
Если я пытаюсь использовать макрос через объективный метод C, а затем применяется в Swift:
-(NSString *)getVarName:(id)var {
return variableName(var)
}
то, конечно, возвращаемое значение NSString будет равно «var».
В общем, как я могу использовать отражение в Swift, чтобы получить, как в этом примере, имя переменной аргумента? До сих пор я проверил множество ресурсов, начиная с документации Apple и заканчивая API-интерфейсом и аналогичным, но, к сожалению, ни один из предопределенных методов времени исполнения не применим в Swift.
могли бы вы покажите нам свой 'ChildElement' класс/struct. – dfri
Конечно!Проверьте обновленный вопрос. Хотя структура класса ChildElement не относится к этому вопросу. – dsafa
Для всех вопросов важно представить пример [минимальный, полный и проверяемый] (http://stackoverflow.com/help/mcve), в основном для увеличения вероятности того, что кто-то поможет вам (поскольку некоторые не будут пытаться попробовать если им нужно добавить собственные собственные фиктивные классы, чтобы воспроизвести поведение, которое кто-то пытается опробовать). – dfri