我以前在Swift 4.2中使用以下代码来生成ID:
public static func generateId() throws -> UInt32 {
let data: Data = try random(bytes: 4)
let value: UInt32 = data.withUnsafeBytes { $0.pointee } // deprecated warning!
return value // + some other stuff
}
Run Code Online (Sandbox Code Playgroud)
withUnsafeBytes在Swift 5.0上已弃用。我该如何解决?
更新到 Swift 5.2 / Xcode 11.4 后收到以下代码警告:
extension Data {
init<T>(from value: T) {
var value = value
let pointer = UnsafeBufferPointer(start: &value, count: 1)
self.init(buffer: pointer)
}
func to<T>(type: T.Type) -> T {
return self.withUnsafeBytes { $0.load(as: T.self) }
}
}
Run Code Online (Sandbox Code Playgroud)
在线let pointer = UnsafeBufferPointer(start: &value, count: 1)我得到了
'UnsafeBufferPointer' 的初始化导致悬空的缓冲区指针
我可以使用@silenceWarning,但这是一个肮脏的解决方案。也许我需要将指针存储在某处并在将来清理它?
如何将4字节数组转换为相应的Int?
let array: [UInt8] ==> let value : Int
Run Code Online (Sandbox Code Playgroud)
例:
\0\0\0\x0e
Run Code Online (Sandbox Code Playgroud)
14
Run Code Online (Sandbox Code Playgroud)
let data = NSData(bytes: array, length: 4)
data.getBytes(&size, length: 4)
// the output to size is 184549376
Run Code Online (Sandbox Code Playgroud) 我知道如何在java中做到这一点(见这里),但是我找不到java的ByteBuffer的快速等价物,因此找不到它的.putDouble(double value)方法.
基本上,我正在寻找这样的功能:func doubleToByteArray(value: Double) -> [UInt8]? {
. . .
}
doubleToByteArray(1729.1729) // should return [64, 155, 4, 177, 12, 178, 149, 234]
Run Code Online (Sandbox Code Playgroud) 在我安装Xcode 8并将项目转换为Swift 3之前,以下行很好.现在转换后它看起来像这样:
let valueData:Data = Data(bytes: UnsafePointer<UInt8>(&intVal), count: sizeof(NSInteger))
Run Code Online (Sandbox Code Playgroud)
它显示错误
模糊地使用'init'
它在Swift 3中有什么问题?怎么解决?
我正在使用Swift在Xcode上编写一个连接到蓝牙BLE外设的应用程序.我已经建立了与设备的连接,并希望从特定特征中读取一些数据(特别是服务UUID FFF0中的FFF1).
如果我想查找信息的特征是characteristicx:我可以使用以下代码请求读取特征:
peripheral.readValueForCharacteristic(charactericsx)
Run Code Online (Sandbox Code Playgroud)
我想知道的是:我如何检查这个读取值是我正在寻找的.我希望能够执行if语句来检查我的值与该特征的已发现值.
例如:如果发现值为X则执行某些操作,否则如果发现的值为Y则执行其他操作.
这不是我想要做的很好的解释,但我希望你能得到主旨.
有谁知道怎么做这个?
更新到Swift 3后,我的代码有点问题.转换前我有这个代码:
extension NSData {
func castToCPointer<T>() -> T {
let mem = UnsafeMutablePointer<T>.alloc(sizeof(T.Type))
self.getBytes(mem, length: sizeof(T.Type))
return mem.move()
}
}
Run Code Online (Sandbox Code Playgroud)
我把它转换成了这个代码,在第3行我得到了一个错误
...无法将'UnsafeMutablePointer'类型的值转换为预期的参数类型'UnsafeMutablePointer'
extension Data {
func castToCPointer<T>() -> T{
let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size)
self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
//self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
return mem.move()
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道怎么摆脱这个?
我正在为iOS Swift中的shapefile构建一个自定义文件打开器(一种GIS格式,与此问题无关).这些文件有一个100字节长的标题.我能够将其读入4字节数组,存储我想要的信息.我可以将这些数组转换成斯威夫特类型Data和NSData,并有转化他们(像一些其他选项Base64EncodedString).但我无法将这些原料阵列或数据或任何的格式转换成有用的属性等Double,Int和String.
import Foundation
struct ShapeReader {
var shapeFile = FileHandle(forReadingAtPath: "/Users/christopherjlowrie/Documents/Shapes/SF_Neighborhoods/Planning_Zones.shp")
var fileHeader: String{
let header = shapeFile?.readData(ofLength: 100)
let headerStream = InputStream(data: header!)
headerStream.open()
var buffer = [UInt8](repeating: 0, count: 4)
while (headerStream.hasBytesAvailable){
headerStream.read(&buffer, maxLength: buffer.count)
print(buffer)
let x = Data(buffer)
print(x)
}
return "A"
}
}
Run Code Online (Sandbox Code Playgroud)
这当前只返回A,因为测试原因我返回一个字符串
我怎么能打开文件,并阅读他们的原始字节分为不同的类型(Doubles,Ints,Strings)的斯威夫特?
如何将整数数组转换为数据?
这就是我所拥有的,但我在弄清楚最后一步时迷失了方向。我只对 Swift 3 解决方案感兴趣。
import Foundation
var buffer = [UInt64]( repeating: 0, count: 1000 )
for x in 0 ..< 1000
{
buffer[x] = UInt64(x)
}
///////
// What goes here to place buffer into myData
var myData = Data()
//
///////
Run Code Online (Sandbox Code Playgroud) 有很多来源解释如何在Swift 2中制作它作为基础:
var value: Int = 0
let data: NSData = ...;
data.getBytes(&value, length: sizeof(Int))
Run Code Online (Sandbox Code Playgroud)
然后我更新了Swift 3的语法/命名:
var value: Int = 0
let data: NSData = ...;
data.copyBytes(to: &value, count: MemoryLayout<Int>.size)
Run Code Online (Sandbox Code Playgroud)
然而它不起作用.编译器不喜欢它的类型value,它应该是UInt8.但我想要Int.谁知道我怎么能做到这一点?