Я хочу использовать typealias для функции, которая используется в универсальном классе. Один из параметров функции использует общий тип класса. Это упрощенный пример:Как использовать параметр типа в typealias?
class Bar {}
// no typealias - works
class TestGeneric<T: Bar> {
let myFunc: (T) -> String
init(myFunc: (T) -> String) {
self.myFunc = myFunc
}
}
let myFunc: (Bar) -> String = {(bar: Bar) in
return "hello"
}
let test = TestGeneric<Bar>(myFunc: myFunc)
println(test.myFunc(Bar()))
// typealias - doesn't compile
class TestTypealias<T: Bar> {
typealias MyFuncGeneric = (T) -> String
let myFunc: MyFuncGeneric
init(myFunc: MyFuncGeneric) {
self.myFunc = myFunc
}
}
let myFunc2: TestTypealias.MyFuncGeneric = {(bar: Bar) in
return "hello"
}
let test2 = TestTypealias<Bar>(myFunc: myFunc2) // Error: Cannot invoke initializer for type 'TestTypealias<Bar>' with an argument list of type '(myFunc: T -> String)'
println(test2.myFunc(Bar()))
Есть ли способ решить эту проблему? Или мне нужно отказываться от типов при использовании дженериков? В реальном коде есть много параметров, и действительно нужно typealias ...
(Swift 1,2)
Мне нужно, чтобы класс был общим и ограничивал тип класса Bar (isA), поэтому я использую ''. То, что мне не хватало, было этой маленькой вещью: объявить функцию как тип 'TestTypealias .MyFuncGeneric' вместо' TestTypealias.MyFuncGeneric'. Это также объясняет, почему моя упрощенная версия кода Грегцо работает, он просто не указал тип, и компилятор делает это правильно. Благодаря! –
Ixx