如何在Swift中解决这种模糊的类型错误?

时间:2016-01-28 22:03:15

标签: ios swift

所以我创建了一个新的Xcode项目,并写了这个Podfile

use_frameworks!

target 'Repro' do
  pod 'Alamofire'
  pod 'Result'
end

然后我运行了pod install,打开了工作区,并创建了一个包含以下内容的新文件:

import Alamofire
import Result

private func something(request: Request) -> Result<Bool, NSError> {
    fatalError()
}

我尝试构建它,但Xcode产生了错误'Result' is ambiguous for type lookup in this context。所以我尝试了明显的修复:

import Alamofire
import Result

private func something(request: Request) -> Result.Result<Bool, NSError> {
    fatalError()
}

但是这给了我错误Reference to generic type 'Result' requires arguments in <...>,好像Swift正在将模块名称解析为类型名称。

什么是非明显的修复?

2 个答案:

答案 0 :(得分:10)

如果您直接导入结果模块的Result类型,它将覆盖Alamofire的Result类型。您仍然可以使用其合格的名称访问Alamofire:

import Alamofire
import enum Result.Result

let a: Alamofire.Result<T, ErrorType> // Alamofire's Result
let r: Result<T, ErrorType> // Result module's Result

我在看到detailed import mentioned in the language reference后通过反复试验找到了这个。我不知道类型名称解析是否记录在任何地方以这种方式工作,所以它可能会在没有太多注意的情况下发生变化。

答案 1 :(得分:-1)

我建议使用swift 2.1来Result cocoapod 超出风格,并且可以通过语言更新来避免 - 他们应该做更像

的事情
private func something(request: Request) throws -> Result {
  // TODO: implement this 
  throw RequestError()
}

,无需包含返回值。

我会在第一个地方(Bool, NSError)使用元组而不是自定义枚举。但那是风格。