" IR生成失败:程序太聪明"在斯威夫特

时间:2014-11-22 08:31:10

标签: swift

完整错误是“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)
}

如果将上述所有内容粘贴到新项目中,您将收到我提到的编译错误。任何人都知道这是什么?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我使用符合CollectionType的协议扩展了一个Array。我相信错误的发生是因为Swift看到Array被要求符合两个具有相同名称的协议,但是并不聪明地知道它们是相同的协议。

我刚刚使用最新版本的Swift(1.2)下载了最新版本的Xcode(6.3),问题似乎已得到修复,因此可能值得为此付出代价。

更新

问题没有解决,它只是停止了编译时错误,而是在运行程序时崩溃。