iOS Swift:将泛型数组转换为子类数组

问题描述:

这个一直在窃听我一段时间。我不确定我是否错过了一些东西,但是不应该这样做?iOS Swift:将泛型数组转换为子类数组

protocol IDIdentifiable { } 

class A : IDIdentifiable { 
    let id : Int 
    init(id: Int) { self.id = id } 
} 

class B : IDIdentifiable { 
    let id : Int 
    init(id: Int) { self.id = id } 
} 

func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T { 
    if let casted = objects as? [A] { 
     return casted.filter{ $0.id == id }[0] 
    } 
} 

将对象参数强制转换为A对象数组时出错。错误说'A' is not a subtype of 'T',显然不是这种情况。

这真的很烦人,因为我想有一个通用的方法可以同样的方式处理多个类的对象数组。我首先尝试使用switch-statements创建一个额外的协议,如IDIdentifiable,但是这些方法都没有奏效。

我很高兴为您提供任何建议!

+0

这和我这里的问题不一样吗? http://*.com/questions/33112559/protocol-doesnt-conform-to-itself – matt

+1

停止说“没有工作”。这没有意义。你已经通过解释这个问题是一个编译错误来解决了这个问题。那就是我所追求的。 – matt

+0

确实非常相似。尽管如此。 – Yeehaw

如果您声明协议要求变量id,则不需要在通用方法中转换类型。

protocol IDIdentifiable { 
    var id : Int { get set } 
} 

class A : IDIdentifiable { 
    var id : Int 
    init(id: Int) { self.id = id } 
} 

class B : IDIdentifiable { 
    var id : Int 
    init(id: Int) { self.id = id } 
} 

func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T { 
    return objects.filter{ $0.id == id }[0] 
} 
+0

这是真的,但它没有解释类型为协议的数组的问题。如果这是关于一个没有被协议定义的属性,但只在A类中定义的属性呢? – matt

+0

我会接受这个答案,因为它现在帮助我解决了这个特殊问题。正如@matt说的那样,这对一般问题没有帮助。 – Yeehaw

+0

我同意。你接受它是正确的,但我们没有得到任何有关_my_问题的地方。 :) – matt