没有更多上下文的情况下,表达式类型是不明确的(Swift)。

168

我正在升级一个项目到最新的Swift版本,但在代码的这一部分中出现了“表达式类型不明确,需要更多上下文”的错误。我似乎无法解决它。我尝试了不同的方法,但是无法使它正常工作。

问题出在这一行的语法上。

let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }

完整代码:

extension TutorialCreationRequest: WebserviceParametrable {
    func toParameters() -> [String: AnyObject] {
        let imageParameters = images.map { ["url": $0] }
        let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }
        return [
            "title": title,
            "is_draft": isDraft,
            "difficulty": difficulty,
            "duration": duration,
            "cost": cost,
            "user_id": userId,
            "description": description,
            "to_sell": toSell,
            "images": [imageParameters, imageToDeleteParameters].flatMap { $0 }
        ]
    }
}

4
Swift编译器错误像这样的官方文档在哪里可以找到? - orion elenzil
19个回答

2

=之前要加上两个" "

let imageToDeleteParameters = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }

1

确保扩展中是否有可用的委托方法,然后实现这些方法,错误就会消失。


1
在我的情况下,当我创建分发版本并且一个类引用了仅在Debug模式下可见的方法时,遇到了这个错误。
就像这样。请尝试为分发版本编译以下类。
class MyClass {
   func sayHello() {
      helloWorld()
    }
    
   #if DEBUG
    func helloWorld() {
         print("Hello world")
    }
   #endif
}

1
在我的情况下,这是与NSFetchedResultsController发生的,并且原因是我为初始化定义了一个不同于我创建请求的模型(RemotePlaylist vs. Playlist):
  var fetchedPlaylistsController:NSFetchedResultsController<RemotePlaylist>!

但是他以请求另一个播放列表的方式发起了它。
let request = Playlist.createFetchRequest()
fetchedPlaylistsController = NSFetchedResultsController(fetchRequest: request, ...

现在又发生了同样的事情,当我写下这句话时:
if let contacts = try? JSONDecoder().decode([Contact.self], from: data) {...

而不是:

if let contacts = try? JSONDecoder().decode([Contact].self, from: data) {...

请注意在正确的行中,.self 在括号外面!

0

正如TheEye的回答并不是针对这个问题的答案,但由于我也在寻找错误而来到这里,所以我将我的情况发布出来,希望其他人也能从中受益:

当我错误地尝试计算两种不同类型的值时,我遇到了这个错误消息。

在我的情况下,我试图将一个CGFloat除以一个Double


0
在我的情况下,我传递的参数具有可选的String值。为其提供一个默认值以便在该值为nil时回退解决了我的问题。
我进行了更改 -
router?.pushToDetailsScreen(
gitHubRepositoryOwnerName: gitHubRepositoryDetails?[index].owner?.login,
gitHubRepositoryName: gitHubRepositoryDetails?[index].name,
avatarUrl: gitHubRepositoryDetails?[index].owner?.avatar_url)

翻译成中文为:

router?.pushToDetailsScreen(
gitHubRepositoryOwnerName: gitHubRepositoryDetails?[index].owner?.login ?? "",
gitHubRepositoryName: gitHubRepositoryDetails?[index].name ?? "",
avatarUrl: gitHubRepositoryDetails?[index].owner?.avatar_url ?? "")

0

这个错误可能由多种原因引起。其中最突出的原因之一是类型不匹配。例如,

假设参数icons是一个数组类型,而我们传递了一个枚举值IconDismiss。

## Wrong
text.config = TextField.Config(isClearable: true, icons: IconDismiss)
## Correct
text.config = TextField.Config(isClearable: true, icons: [IconDismiss])

0
在我的情况下,它与@scottyBlades所说的非常相似。我更改了一个成员变量名称,但没有在回调中更新它,这导致了混淆/不可靠的错误。
class SomeClass {
   var newVarName: String

   func doSomething() {
       Async.makeCall { result in // << error shows here
           self.oldVarName = result // not changing it to newVarName was the cause
       }
   }
}

0
我花了一天以上的时间在这上面。我尝试了上面的所有答案。但对于我的情况,实际上是将另一个类中的错误处理代码复制粘贴到这个函数中,一切看起来都很好,直到我写了与我的自定义错误枚举进行比较的代码,然后我得到了这个“表达式的类型在没有更多上下文的情况下是模棱两可的”错误。
所以问题只是在顶部缺少了一个“import CustomError”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接