Swift 如何在typealias中使用类型参数?

Swift 如何在typealias中使用类型参数?,swift,generics,type-alias,Swift,Generics,Type Alias,我想为泛型类中使用的函数使用typealias。函数的一个参数使用类的泛型类型。这是一个简化的示例: class Bar {} // no typealias - works class TestGeneric<T: Bar> { let myFunc: (T) -> String init(myFunc: (T) -> String) { self.myFunc = myFunc } } let myFunc: (Bar)

我想为泛型类中使用的函数使用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()))
类栏{}
//无类型别名-有效
类TestGeneric{
设myFunc:(T)->String
init(myFunc:(T)->字符串){
self.myFunc=myFunc
}
}
让myFunc:(Bar)->String={(Bar:Bar)在
回复“你好”
}
让test=TestGeneric(myFunc:myFunc)
println(test.myFunc(Bar()))
//typealias-不编译
类TestTypealias{
typealias MyFuncGeneric=(T)->字符串
让myFunc:MyFuncGeneric
init(myFunc:MyFuncGeneric){
self.myFunc=myFunc
}
}
让myFunc2:TestTypealias.MyFuncGeneric={(bar:bar)输入
回复“你好”
}
设test2=TestTypealias(myFunc:myFunc2)//错误:无法使用类型为“(myFunc:T->String)”的参数列表调用类型为“TestTypealias”的初始值设定项
println(test2.myFunc(Bar())
有办法解决这个问题吗?还是在使用泛型时必须放弃typealias?在实际的代码中,我有很多参数,需要一个typealias


(Swift 1.2)

这将按照预期编译和运行:

class Test< T >
{
    typealias GenFunc = ( thing: T ) -> Void

    let thing : T

    init( thing: T )
    {
        self.thing = thing
    }

    func ExecuteFunc( genFunc: GenFunc )
    {
        genFunc( thing: self.thing )
    }
}
通过写作

class TestGeneric<T: Bar> 
与此相反:

func myFunc<T: Bar>(aValue:T) {

    }
func myFunc(aValue:T){
}
每次您要将T定义为Bar类型时

如果希望类本身是泛型的,则只使用
,例如:
类TestGeneric
,类型在初始化时定义

class Bar {}

// no typealias - works
class TestGeneric<T> {
    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> {
    typealias MyFuncGeneric = T -> String
    func myFunc(aValue:T) {

    }
    let myFunc: MyFuncGeneric

    init(myFunc: MyFuncGeneric) {

        self.myFunc = myFunc
    }
}

let myFunc2: TestTypealias<Bar>.MyFuncGeneric = {(bar: Bar) in
    return "hello"
}

let test2 = TestTypealias<Bar>(myFunc: myFunc2)   
println(test2.myFunc(Bar()))
类栏{}
//无类型别名-有效
类TestGeneric{
设myFunc:(T)->String
init(myFunc:(T)->字符串){
self.myFunc=myFunc
}
}
让myFunc:Bar->String={(Bar:Bar)进入
回复“你好”
}
让test=TestGeneric(myFunc:myFunc)
println(test.myFunc(Bar()))
//typealias-不编译
类TestTypealias{
typealias MyFuncGeneric=T->String
func myFunc(aValue:T){
}
让myFunc:MyFuncGeneric
init(myFunc:MyFuncGeneric){
self.myFunc=myFunc
}
}
让myFunc2:TestTypealias.MyFuncGeneric={(bar:bar)输入
回复“你好”
}
设test2=TestTypealias(myFunc:myFunc2)
println(test2.myFunc(Bar())

我将您的示例简化为与我的示例的最小差异,并发现导致编译器错误的是函数的类型声明!因此,如果我写
让myFunc2={(bar:bar)返回“hello”}
而不是
让myFunc2:TestTypealias.MyFuncGeneric={(bar:bar)返回“hello”}
它编译…我需要类是泛型的,并将类型约束为类bar(isA),这就是我使用
的原因。我缺少的是一件小事:将函数声明为type
TestTypealias.MyFuncGeneric
而不是
TestTypealias.MyFuncGeneric
。这也解释了为什么我的Gregzo代码的简化版本可以工作,他只是没有指定类型,编译器就正确地推断了它。谢谢
func myFunc<T: Bar>(aValue:T) {

    }
class Bar {}

// no typealias - works
class TestGeneric<T> {
    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> {
    typealias MyFuncGeneric = T -> String
    func myFunc(aValue:T) {

    }
    let myFunc: MyFuncGeneric

    init(myFunc: MyFuncGeneric) {

        self.myFunc = myFunc
    }
}

let myFunc2: TestTypealias<Bar>.MyFuncGeneric = {(bar: Bar) in
    return "hello"
}

let test2 = TestTypealias<Bar>(myFunc: myFunc2)   
println(test2.myFunc(Bar()))