Swift 断言失败

字节跳动

我的程序编译失败,你能帮我吗?似乎(从这个和我以前的尝试)Swift 不喜欢我使用 inout 参数。

这是我的代码(它通过选择要递归的部分来实现对数内存复杂性的快速排序):

func sort<T: Comparable>(
  _ arr: inout [T],
  _ start: inout Int = 0,
  _ end: inout Int = 0)
{
  if end == 0 { end = arr.count }
  while start < end {
    var i = start
    let pivot = arr[i]
    for j in i + 1 ..< end
    {
      let t = arr[j]
      if t < pivot {
        arr[j] = arr[i]
        arr[i] = t
        i += 1
      }
    }
    if i > start {
      let bounds = [start, i, i, end]
      var j = 2 * i > start + end ? 2 : 0
      (start, end) = (bounds[j], bounds[j + 1])
      sort(&arr, &start, &end)
      j = (j + 2) % 4
      (start, end) = (bounds[j], bounds[j + 1])
    }
    else { start += 1 }
  }
}

var a = [3, 1, 4, 1, 5, 9, 2, 6, 5]
sort(&a)
print(a)

这是输出:

Swift version 5.0.1 (swift-5.0.1-RELEASE)
 swiftc -o main main.swift
swift: /home/buildnode/jenkins/workspace/oss-swift-5.0-package-linux-ubuntu-18_04/swift/lib/AST/ASTContext.cpp:3186: swift::TupleTypeElt::TupleTypeElt(swift::Type, swift::Identifier, swift::ParameterTypeFlags): Assertion `!ty->is<InOutType>() && "caller did not pass a base type"' failed.
Stack dump:
0.  Program arguments: /usr/bin/swift -frontend -c -primary-file main.swift -target x86_64-unknown-linux-gnu -disable-objc-interop -color-diagnostics -module-name main -o /tmp/main-c3dd3d.o 
1.  While type-checking statement at [main.swift:32:1 - line:32:8] RangeText="sort(&a"
2.  While type-checking expression at [main.swift:32:1 - line:32:8] RangeText="sort(&a"
/usr/bin/swift[0x423d3b4]
/usr/bin/swift[0x423b13e]
/usr/bin/swift[0x423d572]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12890)[0x7fbbee94b890]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xc7)[0x7fbbecdaee97]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x141)[0x7fbbecdb0801]
/lib/x86_64-linux-gnu/libc.so.6(+0x3039a)[0x7fbbecda039a]
/lib/x86_64-linux-gnu/libc.so.6(+0x30412)[0x7fbbecda0412]
/usr/bin/swift[0x1758aff]
/usr/bin/swift[0x1509882]
/usr/bin/swift[0x14f9942]
/usr/bin/swift[0x150d06a]
/usr/bin/swift[0x14fbbeb]
/usr/bin/swift[0x17d3117]
/usr/bin/swift[0x14f359b]
/usr/bin/swift[0x143c618]
/usr/bin/swift[0x143c162]
/usr/bin/swift[0x14d1c9d]
/usr/bin/swift[0x14d0e17]
/usr/bin/swift[0x14d0f22]
/usr/bin/swift[0x14f0647]
/usr/bin/swift[0xd3a10a]
/usr/bin/swift[0xd38eb0]
/usr/bin/swift[0xd38511]
/usr/bin/swift[0x4beb31]
/usr/bin/swift[0x4bd7c9]
/usr/bin/swift[0x46e630]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7fbbecd91b97]
/usr/bin/swift[0x46ca4a]
<unknown>:0: error: unable to execute command: Aborted
<unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation)
compiler exit status 254
克里斯提克

inout参数不能有默认值,因为您需要为这些参数提供实际的内存位置。所以你需要var为这些变量创建两个

func sort<T: Comparable>(
  _ arr: inout [T],
  _ start: inout Int,
  _ end: inout Int)
{
   ...
}

var start = 0, end = 0
sort(&arr, &start, &end)

现在,如果您希望能够以更简单的方式调用该函数,而不是强制调用者每次都创建两个变量,并确保这些变量初始化为零,您可以向您的sort函数添加一个重载

func sort<T: Comparable>(
  _ arr: inout [T],
  _ start: inout Int,
  _ end: inout Int)
{
    ...
}

func sort<T: Comparable>(_ arr: inout [T]) {
    var start = 0, end = 0
    sort(&arr, &start, &end)
}

var a = [3, 1, 4, 1, 5, 9, 2, 6, 5]
sort(&a)
print(a)

但是,通过使用 sort 函数扩展Array(甚至Collection,您可以拥有一个更好、更惯用的调用站点

extension Array where Element: Comparable {
    mutating func mySort() {
        var start = 0, end = 0
        Self.mySort(&self, &start, &end)
    }
    
    private static func mySort(
        _ arr: inout [Element],
        _ start: inout Int,
        _ end: inout Int)
    {
        ... same sorting logic
    }
}

var a = [3, 1, 4, 1, 5, 9, 2, 6, 5]
a.mySort() // instead of sort(&a)
print(a)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章