相关疑难解决方法(0)

Swift 5.0:不推荐使用'withUnsafeBytes':使用`withUnsafeBytes <R>(...)

我以前在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上已弃用。我该如何解决?

unsafe-pointers deprecated swift

35
推荐指数
3
解决办法
8882
查看次数

警告:'UnsafeBufferPointer<T>' 的初始化导致悬空的缓冲区指针

更新到 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,但这是一个肮脏的解决方案。也许我需要将指针存储在某处并在将来清理它?

unsafe-pointers swift swift5.2 xcode11.4

32
推荐指数
3
解决办法
7338
查看次数

在Swift中将bytes/Uint8数组转换为Int

如何将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)

arrays int byte swift

23
推荐指数
6
解决办法
3万
查看次数

如何在Flash中将double转换为字节数组?

我知道如何在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)

byte bytebuffer bytearray ios swift

16
推荐指数
2
解决办法
2万
查看次数

Swift 3和Xcode8 - 不明确地使用init

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

let valueData:Data = Data(bytes: UnsafePointer<UInt8>(&intVal), count: sizeof(NSInteger))
Run Code Online (Sandbox Code Playgroud)

它显示错误

模糊地使用'init'

它在Swift 3中有什么问题?怎么解决?

xcode ios swift swift3 xcode8

9
推荐指数
2
解决办法
1万
查看次数

读取BLE周边特性并检查其值?

我正在使用Swift在Xcode上编写一个连接到蓝牙BLE外设的应用程序.我已经建立了与设备的连接,并希望从特定特征中读取一些数据(特别是服务UUID FFF0中的FFF1).

如果我想查找信息的特征是characteristicx:我可以使用以下代码请求读取特征:

peripheral.readValueForCharacteristic(charactericsx)
Run Code Online (Sandbox Code Playgroud)

我想知道的是:我如何检查这个读取值是我正在寻找的.我希望能够执行if语句来检查我的值与该特征的已发现值.

例如:如果发现值为X则执行某些操作,否则如果发现的值为Y则执行其他操作.

这不是我想要做的很好的解释,但我希望你能得到主旨.

有谁知道怎么做这个?

bluetooth ios core-bluetooth swift

8
推荐指数
1
解决办法
1万
查看次数

Swift:无法将'UnsafeMutablePointer'类型的值转换为预期的参数类型'UnsafeMutablePointer'

更新到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)

有谁知道怎么摆脱这个?

swift unsafemutablepointer

7
推荐指数
1
解决办法
1万
查看次数

如何在Swift中将数据转换为双打,Ints和字符串等类型?

我正在为iOS Swift中的shapefile构建一个自定义文件打开器(一种GIS格式,与此问题无关).这些文件有一个100字节长的标题.我能够将其读入4字节数组,存储我想要的信息.我可以将这些数组转换成斯威夫特类型DataNSData,并有转化他们(像一些其他选项Base64EncodedString).但我无法将这些原料阵列或数据或任何的格式转换成有用的属性等Double,IntString.

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

7
推荐指数
1
解决办法
2614
查看次数

将整数数组转换为数据

如何将整数数组转换为数据?

这就是我所拥有的,但我在弄清楚最后一步时迷失了方向。我只对 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)

arrays swift swift3

7
推荐指数
1
解决办法
6287
查看次数

如何在Swift 3中将数据转换为Int?

有很多来源解释如何在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.谁知道我怎么能做到这一点?

ios swift swift2 swift3

6
推荐指数
1
解决办法
8856
查看次数