这是我的代码
class Foo<T> {
}
class Main {
static func test() {
var foo: Foo<Any>
var bar = Foo<String>()
//Do all my stuff with foo necessitating String
foo = bar
}
}
当我尝试分配时foo = bar
,出现错误Cannot assign a value of type Foo<String> to a value of type Foo<Any>
。我不明白为什么会收到此错误,因为String符合Any。如果我使用Array做同样的事情,那么我没有任何错误
static func test() {
var foo: Array<Any>
var bar = Array<String>()
//Do all my stuff with foo necessitating String
foo = bar
}
有人知道我的代码有什么问题吗?谢谢
数组和字典是内置了这种行为的特殊类型。但是,这不适用于自定义泛型类型。该类型Foo<Any>
不是的超类型(或在这种情况下为超类),Foo<String>
即使Any
是的超类型String
。因此,您不能将这些类型的变量相互分配。
根据您的特殊情况,Swift Cast Generics Type中概述的解决方案可能适合您。当Foo
包装类型的值T
,你可以添加一个通用的构造函数的值从一个不同类型的实例转换Foo
。
class Foo<T> {
var val: T
init(val: T) {
self.val = val
}
init<O>(other: Foo<O>) {
self.val = other.val as! T
}
}
class Main {
static func test() {
var foo: Foo<Any>
var bar = Foo<String>(val: "abc")
//Do all my stuff with foo necessitating String
foo = Foo<Any>(other: bar)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句