В моем приложении я хочу создать общий метод, который создает массив объекта, зависящего от заданного типа T.
Я создал следующую функцию:
func getArray<T : ROJSONObject>(key:String) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
Теперь я хочу передать тип при вызове метода, чтобы он знал, какой тип он должен создать внутри. Я думаю, что в Java и С# вы можете использовать такой метод:
object.getArray<Document>("key")
Когда я называю это так, я всегда получаю ошибку:
Cannot explicitly specialize a generic function
Итак, мое исправление заключалось в том, чтобы определить дополнительный параметр, содержащий экземпляр типа T, чтобы он автоматически обнаруживал тип:
func getArray<T : ROJSONObject>(key:String, type:T) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
Нет ли другого способа получить это поведение без передачи неиспользуемого экземпляра? Или я что-то не понимаю?
Дальнейшая проверка
После ответа jtbandes я сделал еще несколько тестов. Я попытался заставить Type, добавив as
в вызов.
class Person {
init() { }
func getWorkingHours() -> Float {
return 40.0
}
}
class Boss : Person {
override func getWorkingHours() -> Float {
println(100.0)
return 100.0
}
}
class Worker : Person {
override func getWorkingHours() -> Float {
println(42.0)
return 42.0
}
}
func getWorkingHours<T : Person>() -> T {
var person = T()
person.getWorkingHours()
return person
}
var worker:Worker = getWorkingHours() as Worker
var boss:Boss = getWorkingHours() as Boss
worker.getWorkingHours() // prints out 40.0 instead of 42.0
boss.getWorkingHours() // prints out 40.0 instead of 100.0
Итак, каким-то образом тип всегда является базовым типом, даже я указал тип с ключевым словом as
. Я знаю, что пример не имеет особого смысла, но он просто предназначен для тестирования.