Как передать тип класса в качестве параметра функции
у меня есть общая функция, которая вызывает веб-службу и сериализует ответ JSON обратно на объект.
class func invokeService<T>(service: String, withParams params: Dictionary<String, String>, returningClass: AnyClass, completionHandler handler: ((T) -> ())) {
/* Construct the URL, call the service and parse the response */
}
то, что я пытаюсь сделать, это эквивалент этого кода Java
public <T> T invokeService(final String serviceURLSuffix, final Map<String, String> params,
final Class<T> classTypeToReturn) {
}
- является ли моя подпись метода для того, что я пытаюсь выполнить правильно?
- более конкретно, с указанием
AnyClassв качестве параметра типа
правильно? - при вызове метода, я передаю
MyObject.selfкак возвращая значение класса, но я получаю компиляцию ошибка "не удается преобразовать тип выражения' () 'в тип 'String'"
CastDAO.invokeService("test", withParams: ["test" : "test"], returningClass: CityInfo.self) { cityInfo in /*...*/
}
Edit:
Я пробовал использовать object_getClass, как упоминалось holex, но теперь я получаю:
ошибка: "введите' CityInfo.Тип' не соответствует протоколу 'AnyObject'"
что нужно сделать, чтобы соответствовать протоколу?
class CityInfo : NSObject {
var cityName: String?
var regionCode: String?
var regionName: String?
}
3 ответов:
вы подходите к нему неправильно: в Swift, в отличие от Objective-C, классы имеют определенные типы и даже имеют иерархию наследования (то есть, если class
Bнаследует отA, потомB.Typeнаследуется отA.Type):class A {} class B: A {} class C {} // B inherits from A let object: A = B() // B.Type also inherits from A.Type let type: A.Type = B.self // Error: 'C' is not a subtype of 'A' let type2: A.Type = C.selfвот почему вы не должны использовать
AnyClass, если вы действительно не хотите, чтобы позволить любой класса. В этом случае правильный тип будетT.Type, потому что он выражает связь между
вы можете получить класс
AnyObjectчерез таким образом:Swift 3.x
let myClass: AnyClass = type(of: self)Swift 2.x
let myClass: AnyClass = object_getClass(self)и вы можете передать его как paramater позже, если хотите.
использовать
obj-getclass:CastDAO.invokeService("test", withParams: ["test" : "test"], returningClass: obj-getclass(self)) { cityInfo in /*...*/ }предполагая, что self является объектом информации о городе.
Comments