我有一个包含一堆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
中的对象与我传入的元类型没有相同的类型信息。
我觉得这应该是可能的,但我很难过。
答案 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)