如何在typealias中使用type参数?

时间:2015-04-28 10:22:51

标签: 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) -> 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)

2 个答案:

答案 0 :(得分:1)

这会按预期编译并运行:

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 )
    }
}

使用:

let t = Test( thing: "blah" )

t.ExecuteFunc()
{ ( thing: String ) -> Void in
    println( thing )
}

答案 1 :(得分:1)

写作

class TestGeneric<T: Bar> 

你所做的一切都是在方法中使用时将T普遍定义为Bar类型,所以你可以这样写:

func myFunc(aValue:T) {

}

而不是:

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

    }

每次要将T定义为Bar类型时。

如果您希望类本身是通用的,则只使用<T>,例如:class TestGeneric<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()))