在Swift中,我声明了一个与Array.count
不同的函数,只有当array == nil
函数返回0
时。这与我的UITableViewDataSource
有关,但这并不重要。问题是,如果我将函数声明为:
class func countOfItemsInArray(array: [AnyObject]?) -> Int
然后尝试传递一个结构数组,它声明数组中的结构不符合AnyObject
。我理解为什么会这样(我认为),但是有没有办法使用和结构类来实现这个功能,或者我应该让它复制并粘贴?
答案 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。