Как передать тип класса в качестве параметра функции



у меня есть общая функция, которая вызывает веб-службу и сериализует ответ 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?
}
589   3  

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

    Ничего не найдено.