bor*_*ero 5 generics swift ios8
我有一个泛型类,我有一个泛型类型的数组.不,我想根据数组中的类进行一些操作.我有2个班:人和家(没有继承).但是这段代码不起作用:
let allValues = [T]()
if allValues[0] is Person {
let values = (allValues as [Person])
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为T与'人'不同.我需要做什么?谢谢你的帮助.
你可以\xe2\x80\x99t 这样做(或者至少,不跳过一些相当曲折和不明智的循环)。您所考虑的T更像是类型,这是一种可以容纳任何其他类型的类型,并且您可以在运行时使用(或者最好是)Any将其转回真实类型。 asas?
但泛型并不像这样工作。在您的代码中,泛型T将在编译时替换为真实类型,并且该类型可能不是Person. 如果是这种情况,上面的代码会做什么?
您\xe2\x80\x99实际想要实现的底层功能是什么?人和房子有很大不同,所以你真的需要编写一个对两者通用的函数吗?
\n我同意Oliver Borchert和Airspeed Velocity 的观点:这种问题应该使用协议来解决。
但是,您可以使用以下语法执行您询问的转换:
let values = allValues as Any as [Person]
Run Code Online (Sandbox Code Playgroud)
现在我看到两个问题:
allValues 可以在第一个元素处包含一个 Person,在第二个位置处包含其他元素。仅评估第一个元素后,这会导致危险的强制转换。
例子
生命形式类{}
类 Person:LifeForm {}
T 等于 LifeForm。
我认为以下版本更安全,因为您直接评估类型 T。
class Things<T>{
func doSomething() {
let allValues = [T]()
// populate allValues....
if T.self is Person.Type {
println("List of Person")
let values = allValues as Any as [Person]
}
}
}
Run Code Online (Sandbox Code Playgroud)
重要提示:我提供此代码只是为了展示语法。我不喜欢这个abborach(同样,协议会更好),因为Things 类包含特定于Person 的逻辑。理想情况下,Things应该对Person一无所知,因为Things是一个泛型类。
| 归档时间: |
|
| 查看次数: |
9310 次 |
| 最近记录: |