iOS swift : Generic array cast to array of subclass

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

将对象参数转换为 A 对象数组时会发生错误。该错误表明“A”不是“T”的子类型,显然情况并非如此。

这真的很烦人,因为我想要一个通用方法,可以以相同的方式处理多个类的对象数组。我首先尝试使用 switch 语句,不创建额外的协议(protocol)(如 IDIdentific),但这些方法都不起作用。

我很高兴收到任何建议!

最佳答案

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

关于iOS swift : Generic array cast to array of subclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172813/

相关文章:

ios - WatchKit 从 iPhone 中关闭的 App 获取数据

ios - swift xcode 错误 : "Row.Type has no subscript members"

ios - 在 Objective-C 中读取 rtf 文件

ios - Swift - 计时器不会停止

c# - 结合泛型方法和重载

ios - 将 facebook 聊天 API 集成到 iOS 应用程序中

ios - Swift 4 UIActivityIndi​​catorView 不以 UITableView 为中心

ios - 键盘隐藏早于查看

java - 如何获取泛型类型参数?

java - 设计类型安全 API 时的具体与有界参数化类型