我正在努力学习Swift
并完成Ch中的示例。苹果公司的一本书。最后一个练习给我带来了很多麻烦,我正在尝试构造一个函数,它返回作为参数传递的两个序列的公共元素。这是我试过的代码:
func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element:
Equatable, T.Generator.Element == U.Generator.Element>
(lhs: T, rhs: U) -> [T.Generator.Element] {
var result : [T.Generator.Element] // how to default-initialize it?
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
result.append(lhsItem)
}
}
}
return result
}
我唯一的问题是我不知道如何初始化result
([T.Generator.Element]
类型),因此我无法使用后者将公共元素附加到其中。我试过了明显的
var result : [T.Generator.Element] = [T.Generator.Element]()
然而我收到错误Could not find member Element
,如果我尝试
var result : [T.Generator.Element] = [T.Generator.Element()]()
编译器吐出T.Generator.Element cannot be constructed because it has no accessible initializers
知道如何初始化这样的数组吗?还是有其他明显的解决方案(我现在没有看到)?
答案 0 :(得分:8)
您可以创建一个空数组(或字典),而无需调用其元素类型的初始值设定项:
var result : [T.Generator.Element] = []
(对于空字典,请使用[:]
。)
然而,似乎你的第一次尝试([T.Generator.Element]()
)应该被编译器接受 - 它不会调用元素类型的初始化器。我建议filing a bug并在the developer forums上询问Apple官方的答案是什么。