Swift:用于查找给定类型实例的通用函数

时间:2015-02-06 01:47:37

标签: ios swift

我有一个包含一堆UITableCellViews的nib,它们都来自一个名为MessageCell的类。这些自定义类在Objective C中,我已将它们连接到我的Swift项目中。

我希望能够获得一个感兴趣的东西。我试过这个功能

func cellTypeFromNib<T>(type : T) -> MessageCell? {
    var cell : MessageCell? = nil
    for obj in self.nibObjs {
        if (obj is T) {
            return obj as? MessageCell
        }
    }
    return cell     
}

并像这样调用它:

let cell = cellTypeFromNib(DerivedCell.self)?

这失败了。单步执行调试器,看起来nibObjs中的对象与我传​​入的元类型没有相同的类型信息。

我觉得这应该是可能的,但我很难过。

2 个答案:

答案 0 :(得分:0)

通过纯粹的意志力,我解决了这个问题。

正确的声明如下

func cellTypeFromNib<T>(type : T.Type) -> MessageCell? {
 for obj in self.nibObjs {
    if (obj is T) {
        return obj as? MessageCell
    }
 }
 return nil     
}

秘密是.Type模板参数。我会喜欢为什么的一些指导,但我会满足于如何。

编辑:删除无关的局部变量

答案 1 :(得分:0)

您的回答是正确的,但您应将T约束为MessageCell

func cellTypeFromNib<T: MessageCell>(type : T.Type) -> MessageCell? {
    for obj in self.nibObjs {
        if let cell = obj as? T {
            return cell
        }
    }
    return nil
}

<T: MessageCell>确保cell在编译时为MessageCell。这可以防止有人意外地将其称为let cell = cellTypeFromNib(UnrelatedClass.self)