2015-02-06 62 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