在 Swift 中,我声明了一个与 Array.count 不同的函数,仅当 array == nil 时函数返回 0。这与我的 UITableViewDataSource 有关,但在这里并不重要。问题是,如果我将函数声明为:
class func countOfItemsInArray(array: [AnyObject]?) -> Int
然后尝试向它传递一个结构数组,它声明数组中的结构不符合AnyObject。我明白为什么会这样(我认为),但是有没有办法让类 和 结构工作,或者我应该让步复制和粘贴?
请您参考如下方法:
泛型可能比依赖 [AnyObject] 的协变更适合解决这个问题。 countElements 的一个版本在可选数组上工作并在 nil 的情况下返回 0 可以像这样:
func countElements<T>(array: [T]?) -> Int {
return array?.count ?? 0
}
当您使用任何类型的数组调用 countElements 时,占位符 T 将替换为数组中包含的元素的类型。
请注意,此版本使用可选的版本重载了现有的 countElements。如果您使用非可选或任何其他类型的集合调用它,则会调用 Swift 版本,如果您传入可选数组,则会调用此版本。这是一个好的做法(我认为很好)还是一个坏的做法(有些人可能不赞成 :),这是值得商榷的。
适用于任何集合类型的版本是:
func countElements<C: CollectionType>(col: C?) -> C.Index.Distance {
return col.map { countElements($0) } ?? 0
}
