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
具有 UnsafePointer
和 UnsafeMutablePointer
的初始化器,并且 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 的模糊使用的主要内容,如果未能解决你的问题,请参考以下文章
Xcode8/Swift 3 更新后缺少 Firebase 标头警告