零不可转换为可清洗。

时间:2015-05-09 11:49:29

标签: swift generics hashable

我有一个使用数据源来获取项目的自定义控件(如NSTableView所做的那样)。数据源可以返回Any-type,只要它可以清除。这些项目用作私人字典中的密钥。

控件(自定义视图)将添加到界面构建器中的UI中。

当我使用nil参数查询数据源时遇到问题,因为nil不能转换为hashable。

这样做的正确方法是什么?

protocol DataSourceProtocol
{
  func numberOfChildrenOfItem<Item: Hashable>(item: Item?) -> Int
  func child<Item: Hashable>(index: Int, ofItem item: Item?) -> Item
}

class MyControl : NSControl
{
  var dataSource : DataSourceProtocol!

  func reloadData()
  {
    //using string as an example of a hashable 
    let countA = dataSource.numberOfChildrenOfItem("item")  // ok
    let countB = dataSource.numberOfChildrenOfItem(nil)     // not ok

    let childA = dataSource.child(0, ofItem: "item") //ok
    let childB = dataSource.child(0, ofItem: nil) //not ok
    self.reloadChildren(childA)
    self.reloadChildren(childB)
  }

  func reloadChildren<Item: Hashable>(item: Item)
  {}

}

1 个答案:

答案 0 :(得分:1)

使用NSNull()获取一个空对象,然后您可以将其与另一个NSNull()进行比较,以查看它是否为空。