簡體   English   中英

Xcode 10 Swift構建錯誤:“將非轉義的值轉換為'T'可能會使其逸出”

[英]Xcode 10 Swift build error: “Converting non-escaping value to 'T' may allow it to escape”

我正在使用Swift-VectorBoolean庫,該庫當前在Swift 3.2上,尚未針對Swift 4.2進行更新,但仍應在Xcode 10上運行。在Xcode 9上運行該庫可以正常工作。 在Xcode 10上,它給出了一個我不確定如何解決的錯誤。 這是有問題的功能:

typealias MyPathApplier = @convention(block) (UnsafePointer<CGPathElement>) -> Void
// Note: You must declare MyPathApplier as @convention(block), because
// if you don't, you get "fatal error: can't unsafeBitCast between
// types of different sizes" at runtime, on Mac OS X at least.

private func myPathApply(_ path: CGPath!, block: MyPathApplier) {
  let callback: @convention(c) (UnsafeMutableRawPointer, UnsafePointer<CGPathElement>) -> Void = { (info, element) in
    let block = unsafeBitCast(info, to: MyPathApplier.self)
    block(element)
  }

  path.apply(info: unsafeBitCast(block, to: UnsafeMutableRawPointer.self), function: unsafeBitCast(callback, to: CGPathApplierFunction.self))
}

錯誤在最后一行path.apply ,突出顯示了第一個unsafeBitCast

Converting non-escaping value to 'T' may allow it to escape

我不確定如何修改此代碼以消除錯誤,或者這是否是Xcode 10的問題。它應該能夠編譯Xcode 3.2代碼。甚至將代碼庫更新為Xcode 9中的Swift 4,它仍然有同樣的問題。

編輯:使用@Vyacheslav的答案更改它,使其可以編譯,但是會遇到運行時錯誤:“致命錯誤:不同大小類型之間不能unsafeBitCast”

在上面的示例中未包含的功能上方提供了注釋:

// Note: You must declare MyPathApplier as @convention(block), because
// if you don't, you get "fatal error: can't unsafeBitCast between
// types of different sizes" at runtime, on Mac OS X at least.

我仍然不明白需要在此處進行哪些更改以確保其構建,並且我們也沒有遇到運行時錯誤。

使用

private func myPathApply(_ path: CGPath!, 
    block: @escaping @convention(block) (UnsafePointer<CGPathElement>) -> Void) {

}

@noescape現在默認為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM