generic [T.Generator.Element]初始化程序

vso*_*tco 2 swift

我正在努力学习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
}
Run Code Online (Sandbox Code Playgroud)

我唯一的问题是我不知道如何初始化result(类型[T.Generator.Element]),因此我不能使用它来将公共元素附加到其中.我试过了明显的事

var result : [T.Generator.Element] = [T.Generator.Element]()
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误Could not find member Element,如果我尝试

var result : [T.Generator.Element] = [T.Generator.Element()]()
Run Code Online (Sandbox Code Playgroud)

编译器吐出 T.Generator.Element cannot be constructed because it has no accessible initializers

知道如何初始化这样的数组吗?还是有其他明显的解决方案(我现在没有看到)?

ric*_*ter 8

您可以创建一个空数组(或字典),而无需调用其元素类型的初始值设定项:

var result : [T.Generator.Element] = []
Run Code Online (Sandbox Code Playgroud)

(对于空字典,请使用[:].)

但是,似乎你的第一个try([T.Generator.Element]())应该是编译器可以接受的 - 它不会调用元素类型的初始化器.我建议提交一个错误,并在开发者论坛上询问Apple官方的答案是什么.

  • 如果你从[WWDC](http://developer.apple.com/wwdc/videos)观看Swift演讲,你会发现数组远不止于此.至于与C++过于束缚,嗯......他们说第一步是承认问题,所以你走在正确的轨道上.;) (2认同)