完整错误是“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)
}
如果将上述所有内容粘贴到新项目中,您将收到我提到的编译错误。任何人都知道这是什么?
答案 0 :(得分:0)
我遇到了同样的问题,我使用符合CollectionType的协议扩展了一个Array。我相信错误的发生是因为Swift看到Array被要求符合两个具有相同名称的协议,但是并不聪明地知道它们是相同的协议。
我刚刚使用最新版本的Swift(1.2)下载了最新版本的Xcode(6.3),问题似乎已得到修复,因此可能值得为此付出代价。
问题没有解决,它只是停止了编译时错误,而是在运行程序时崩溃。