我正在创建一个NSOperation子类,并使用以下代码片段来管理状态和ready(以及executingfinished)属性:

public class OperationGroup : NSOperation {

    enum ExecutionState {
        case Ready
        case Executing
        case Finished
    }

    var state:ExecutionState

    override public var ready:Bool {
        return state == .Ready && super.ready
    }

    override init() {
        state = .Ready
    }
}

当通过REPL或作为应用程序的一部分进行链接时,会出现以下错误:
Global is external, but doesn't have external or weak linkage!
i8* ()* @_TFFC13__lldb_expr_114OperationGroupg5readySbaL_4selfS0_
invalid linkage type for function declaration
i8* ()* @_TFFC13__lldb_expr_114OperationGroupg5readySbaL_4selfS0_

到目前为止,我发现的唯一方法是省略对super.ready的调用,这将对我当前的项目有效,但如果我尝试将OperationGroup与依赖项结合使用,则将来可能会中断。
这是不是编译器的一个错误,因为编译器不应该让我调用super.ready,或者它应该实际工作,或者我做错了什么?
FWIW,如果我将state == .Ready && super.ready改为super.ready它也会编译和链接,但这可能只是编译器优化了整个过程。

最佳答案

奇怪的是,如果您将顺序从以下更改为:

return state == .Ready && super.ready

致:
return super.ready && state == .Ready

或者,如果订单真的让你烦恼,你可以:
if state != .Ready {
    return false
}
return super.ready

不管怎样,在我看来,这是一个编译器错误,值得一个错误报告。

07-24 09:44
查看更多