iOS Swift:通用数组转换为子类

时间:2015-10-16 14:22:43

标签: ios swift generics casting

这个一直困扰我一段时间。我不确定我是否遗漏了某些东西,但不应该这样做吗?

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

将objects参数强制转换为A对象数组时会发生错误。错误显示'A' is not a subtype of 'T',显然情况并非如此。

它真的很烦人,因为我希望有一个通用的方法,可以用同样的方式处理多个类的对象数组。我首先尝试使用switch-statements创建IDIdentifiable之类的额外协议,但这些方法都不起作用。

我对任何建议感到高兴!

1 个答案:

答案 0 :(得分:0)

如果声明协议需要变量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]
}