2015-02-06 91 views
1

我有一个包含一堆UITableCellViews的笔尖,这些UITableCellViews都来自一个名为MessageCell的类。这些自定义类位于Objective C中,我已将它们桥接到我的Swift项目中。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

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

正确的声明如下

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

秘密是。键入的模板参数。我会喜欢为什么一些指导,但我会解决如何。

编辑:去除多余的局部变量

+0

self.nibObjs包含的UITableViewCell实例的数组 – MattD 2015-02-06 02:58:50

+0

公平一点 - 我将修改 – MattD 2015-02-06 03:01:27

+0

接受我自己的答案,因为通过林太郎带来的一个不为雨燕1.1的 – MattD 2015-02-22 17:44:45

0

你的答案是正确的,但你应该限制TMessageCell

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>确保cellMessageCell在编译时。这样可以防止有人不小心把它像let cell = cellTypeFromNib(UnrelatedClass.self)

+0

我不工作吨知道它是否适用于这里,但我有一个问题,可选投射+可选绑定不能按预期工作:http://stackoverflow.com/questions/25838032/optional-binding-succeeds-if-it-shouldnt。在这种情况下,*移除*类型约束是解决该问题/错误的一种方法。 – 2015-02-06 13:10:22

+0

感谢您指出有趣的问题! – rintaro 2015-02-06 13:21:39

+0

我与Martin R有同样的问题 - 当将T约束到基本类型时,我得到了一个误报。类型继承应该镜像值继承,所以这可能是一个错误。 – MattD 2015-02-06 14:55:23