Swift 3 和 Xcode8 - init 的模糊使用

Posted

技术标签:

【中文标题】Swift 3 和 Xcode8 - init 的模糊使用【英文标题】:Swift 3 and Xcode8 - Ambiguous use of init 【发布时间】:2016-09-19 17:44:13 【问题描述】:

在我安装 Xcode 8 并将项目转换为 Swift 3 之前,以下行很好。现在转换后看起来像这样:

let valueData:Data = Data(bytes: UnsafePointer<UInt8>(&intVal), count: sizeof(NSInteger))

显示错误

'init' 的模糊使用

在 Swift 3 中有什么问题?如何解决?

【问题讨论】:

【参考方案1】:

UnsafePointer 具有 UnsafePointerUnsafeMutablePointer 的初始化器,并且 sizeof 已移至 MemoryLayout 消除歧义为:

let valueData = withUnsafePointer(to: &intVal)
    return Data(bytes: $0, count: MemoryLayout<NSInteger>.size)

【讨论】:

这个答案对我有用(而不是接受的答案)。 @i4niac:我已经仔细检查了这两个答案都适用于当前的 Xcode 8.2.1(并产生相同的结果)。如果我的回答有问题,请告诉我。它怎么不工作?你得到错误或错误的结果吗? 在我的例子中,我有一个 UInt8 数组,需要一个指向 &buffer[offset] 的指针。此答案有效,但根据接受的答案使用 UnsafeBufferPointer 无效【参考方案2】:

从一个简单的值创建Data 的最简单方法是通过 UnsafeBufferPointer,则不需要任何显式的指针转换或大小计算:

var intVal = 1000
let data = Data(buffer: UnsafeBufferPointer(start: &intVal, count: 1))
print(data as NSData) // <e8030000 00000000>

关于从值转换为Data 的更通用方法 并返回,例如参见round trip Swift number types to/from Data。

【讨论】:

我在尝试获取指向数组 &buffer[offset] 中元素的指针时遇到问题。此答案因“无法下标 inout[UInt8] 的值”而失败。使用 withUnsafePointer 的替代答案工作正常

以上是关于Swift 3 和 Xcode8 - init 的模糊使用的主要内容,如果未能解决你的问题,请参考以下文章

swift 2.3 和 Xcode8.1 中的通用加密

Xcode8/Swift 3 更新后缺少 Firebase 标头警告

UIImagePickerController 崩溃应用程序 |斯威夫特3,Xcode8

如何在 Xcode8 上使用 Swift 2.2?

swift 3(xCode8-beta6)上的可达性问题

如何用Xcode8和Swift 3 构建条形码/二维码识别应用