gpt4 book ai didi

swift - swift 中的 "IR generation failure: program too clever"

转载 作者:搜寻专家 更新时间:2023-11-01 05:42:21 24 4
gpt4 key购买 nike

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

如果将以上所有内容粘贴到一个新项目中,就会出现我提到的编译错误。有人知道这是什么吗?

最佳答案

我遇到了同样的问题,我用一个也符合 CollectionType 的协议(protocol)扩展了一个数组。我认为错误的发生是因为 Swift 看到 Array 被要求遵守两个同名的协议(protocol),但不够聪明,无法确定它们是同一个协议(protocol)。

我刚刚下载了最新版本的 Xcode (6.3) 和最新版本的 Swift (1.2),问题似乎已解决,因此可能值得再试一次。

更新

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

关于swift - swift 中的 "IR generation failure: program too clever",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com