【问题标题】:inout parameter in closure crashes the Swift compiler闭包中的 inout 参数使 Swift 编译器崩溃
【发布时间】:2015-01-01 00:54:24
【问题描述】:

我需要做的就是在 Swift 中开始一个新项目并添加到main.swift

struct Foo {
  let bar: (inout baz: String) -> ()
}

当我尝试构建时出现错误:
Command failed due to signal: Segmentation fault: 11

我做错什么了吗?

我认为可能不支持闭包中的inout 参数,但如果我这样定义闭包:

let baz: (inout baz: String) -> () = { baz in
  baz += "x"
  return
}

甚至

var baz: (inout baz: String) -> ()?

它编译并运行正常

【问题讨论】:

  • 我在 Apple Bug Reporter 中开了一张票。我认为这是一个错误。 Swift 编译器现在有点问题。
  • 在您的第一个示例中,编译器找不到类型。在您的第二个示例中,编译器可以发现它是因为您间接定义的事实。在最后一个示例中,它只是一个可选的,因此存在将始终为真。
  • 你是对的;这失败了。

标签: xcode swift compiler-errors closures


【解决方案1】:

@Bartek Chlebek。在您发布的代码中,有一个模棱两可的事情(以粗体显示):“let bar: (inout baz: String) -> ()”。当这样定义你的函数时,你告诉编译器你将返回一个空元组。似乎早期版本的编译器没有区分(必须是类型推断引擎中的错误)Void 类型和“空元组类型”(用“()”表示)。下面是关于元组语法的两句话:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html#//apple_ref/doc/uid/TP40014097-CH31-ID448

可能的解决方案:明确指定返回值类型(在您的情况下为“Void”)。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    刚刚在 Xcode 6.3 beta 附带的 Swift 1.2 中对其进行了测试,并且编译成功。 所以这绝对是他们在上一个版本中解决的编译器的一个错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多