完整的错误是"IR生成失败:程序太巧妙:变量与现有的符号_TWPSaSs12SequenceType冲突“。
我正在编写一系列函数作为学习Swift的练习,尤其是Swift泛型。我的最新函数concatenate
尝试实现Haskell的Data.List.concat
。它是这样的:
protocol Concatenable {
func +(lhs: Self, rhs: Self) -> Self
init()
}
extension Array: Concatenable {}
func concatenate<S: SequenceType, C: Concatenable where S.Generator.Element == C>(seq: S) -> C {
var result = C()
for elem in seq {
result = result + elem
}
return result
}
这样做效果很好。然而,作为一个实验,我想要求任何Concatenable
也是一个SequenceType
,所以我按如下方式修改了代码:
protocol Concatenable: SequenceType {
// etc.
}
一旦我这样做了,我就得到了上面提到的错误。但是,如果您将这段代码粘贴到一个新的Swift项目中,一切都会正常工作。所以它与我的项目中的其他东西相冲突。正因为如此--我为我的长度道歉--我在这里粘贴了我的整个“函数库”。
func foreach<S: SequenceType, T where T == S.Generator.Element>(seq: S, action: (T -> Void)) {
for elem in seq {
action(elem)
}
}
protocol Concatenable: SequenceType {
func +(lhs: Self, rhs: Self) -> Self
init()
}
extension Array: Concatenable {}
func concatenate<S: SequenceType, C: Concatenable where S.Generator.Element == C>(seq: S) -> C {
var result = C()
for elem in seq {
result = result + elem
}
return result
}
typealias AutoOptional = @autoclosure () -> Any?
func coalesce<S: SequenceType where S.Generator.Element == AutoOptional>(values: S) -> Any? {
for value: () -> Any? in values {
if let found = value() {
return found
}
}
return nil
}
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
return coalesce(values)
}
func any(values: [() -> Any?]) -> Any? {
for value: () -> Any? in values {
if let found = value() {
if let truth = found as? Bool {
if truth {
return truth
}
} else {
return found
}
}
}
return nil
}
func any(values: @autoclosure () -> Any?...) -> Any? {
return any(values)
}
func any<T>(test: T -> Bool, values: [@autoclosure () -> T]) -> T? {
for value: () -> T in values {
let found = value()
if test(found) {
return found
}
}
return nil
}
func any<T>(values: [@autoclosure () -> T], test: T -> Bool) -> T? {
return any(test, values)
}
func any<T>(test: T -> Bool, values: @autoclosure () -> T...) -> T? {
return any(test, values)
}
func all(values: [@autoclosure () -> Any?]) -> Bool {
for value: () -> Any? in values {
if let found = value() {
if let truth = found as? Bool {
if !truth {
return false
}
}
} else {
return false
}
}
return true
}
func all(values: @autoclosure () -> Any?...) -> Bool {
return all(values)
}
func all<T>(test: T -> Bool, values: [@autoclosure () -> T]) -> Bool {
for value: () -> T in values {
if !test(value()) {
return false
}
}
return true
}
func all<T>(values: [@autoclosure () -> T], test: T -> Bool) -> Bool {
return all(test, values)
}
func all<T>(test: T -> Bool, values: @autoclosure () -> T...) -> Bool {
return all(test, values)
}
如果您将上述所有内容粘贴到一个新项目中,将会出现我提到的编译错误。有人知道这是什么吗?
发布于 2015-04-09 18:13:10
我也遇到了同样的问题,我用一个同样符合CollectionType的协议扩展了一个数组。我相信这个错误的发生是因为Swift发现Array被要求遵循两个同名的协议,但又不够聪明,无法弄清楚它们是同一个协议。
我刚刚下载了最新版本的Xcode (6.3)和最新版本的Swift (1.2),这个问题似乎已经解决了,所以可能值得再试一次。
更新
这个问题并没有修复,它只是不再是一个编译时错误,而是在运行程序时崩溃。
发布于 2015-09-10 16:50:36
在我的例子中,这发生在发布版本上,将优化级别从“快速,整个模块优化”切换到“快速”来修复它。
https://stackoverflow.com/questions/27075520
复制相似问题