为什么在已知的情况下传递泛型类型

时间:2017-10-04 22:09:11

标签: swift generics swift4

这个问题源于阅读围绕NSKeyedUnarchiver(文档here)的文档及其实例方法:

 func decodeDecodable<T>(_ type: T.Type, forKey key: String) -> T? where T : Decodable

如果已经可以从_ type: T.Type确定类型,则传递T的目的是什么?

1 个答案:

答案 0 :(得分:3)

Swift只允许您在类型上显式指定泛型参数,而不是方法或函数。

struct Foo<T> {
    func bar<U>() -> U
}

let foo = Foo<Int>() // legal
foo.bar<Int>() // illegal

语言可以从返回值推断T

let foo = Foo<Int>() // legal
let bar: Int = foo.bar() // legal: T inferred to be Int

但是,使用多态时,这并不总是正确的。

class Bar {}
class Baz: Bar {}

let decoded: Bar = decodeDecodable(forKey: "baz")
// would infer decodeDecodable<Bar>(forKey: "baz")
// which is not correct for a Baz object