Skip to main content
 首页 » 操作系统

arrays之传递包含类或结构的数组

2024年01月01日40myhome

在 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 
}