传递包含类或结构的数组

时间:2015-01-31 18:33:21

标签: arrays function class swift struct

在Swift中,我声明了一个与Array.count不同的函数,只有当array == nil函数返回0时。这与我的UITableViewDataSource有关,但这并不重要。问题是,如果我将函数声明为:

class func countOfItemsInArray(array: [AnyObject]?) -> Int

然后尝试传递一个结构数组,它声明数组中的结构不符合AnyObject。我理解为什么会这样(我认为),但是有没有办法使用结构类来实现这个功能,或者我应该让它复制并粘贴?

2 个答案:

答案 0 :(得分:3)

泛型可能比依赖[AnyObject]的协方差更适合这个问题。在countElements的情况下处理可选数组并返回0的nil版本可能是这样的:

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
}

答案 1 :(得分:0)

如果您使用Any代替AnyObject,则可以传递任何类型,因此结构也是如此:

class func countOfItemsInArray(array: [Any]?) -> Int

这有点奇怪。

我使用了这个功能:

func countOfItemsInArray(array: [Any]?) -> Int {
    return array != nil ? array!.count : 0
}

声明了两个Assignment结构并将它们放在一个数组中:

let structOne = Assignment(name: "1", dueDate: NSDate(), subject: "1")
let structTwo = Assignment(name: "2", dueDate: NSDate(), subject: "2")
let myArray: [Assignment] = [structOne, structTwo]

但这是有趣的部分。
致电println(countOfItemsInArray(myArray))时会出错:

<stdin>:27:33: error: 'Assignment' is not identical to 'Any'
println(countOfItemsInArray(myArray))
^
<stdin>:17:26: note: in initialization of parameter 'array'
func countOfItemsInArray(array: [Any]?) -> Int {
^

所以我测试了myArray类型[Any]

println(myArray is [Any])
斯威夫特说:

<stdin>:25:17: error: 'Any' is not a subtype of 'Assignment'
println(myArray is [Any])
^

但是,当我将myArray的类型注释更改为[Any]时,它可以正常工作:

let myArray: [Any] = [structOne, structTwo]

当简单地将文字交给函数时,它也可以工作:

countOfItemsInArray([structOne, structTwo])

可以看到整个代码示例here