NSData to Data swift 3

Ngu*_*Duc 7 ios swift3

var dataFile: NSData = NSMutableData.init(data: wav.subdataWithRange(NSRange.init(location: currentByte, length: wavDataSize)))
Run Code Online (Sandbox Code Playgroud)

如何将此代码转换为使用DataSwift 3?或如何解析NSRangeRange

Mob*_*Dan 11

分离Data成较小的Data情况下,

假设

这个答案是Swift 3和4相当于问题中的代码.在dataFile给定相同的输入值的情况下wav,它将产生相同的结果:currentByte并且wavDataSize 假设周围的代码没有任何变化.

我没有做假设,有关变量是什么:wav,dataFile,currentBytewavDataSize意思.为了避免变量名暗示的东西的问题不说,我将使用下列名称改为:sourceData,subdata,rangeStartBytesubdataLength.我假设围绕此问题的代码(未在问题中显示)将确保rangeStartByte并且subdataLength在有效范围内以避免错误.

 

将NSRange转换为Range <Int>

问题中的Swift 2实现使用NSRange由起点和长度定义,如下所示:

NSRange.init(location: rangeStartByte, length: subdataLength)
Run Code Online (Sandbox Code Playgroud)

我建议的Swift 3&4实现创建一个Range<Int>由起点和终点定义的等价物,如下所示:

rangeStartByte ..< (rangeStartByte + subdataLength)
Run Code Online (Sandbox Code Playgroud)

我将一个应用程序从Swift 2.2转换为3,它使用类似的代码以较小的块上传照片.在转换过程中,我们错过了这个细微差别,并使用Swift 2实现的长度来代替Swift 3和4实现的终点.这导致了一个难以解决的缺陷.第一次迭代成功但后续迭代失败.

另一个答案实现了我刚才描述的问题解决方案.它使用subdataLengthSwift 2系列的长度作为Swift 3和4系列的终点.这将在currentByte为0并且subdataLength<= NSData实例的长度的特殊情况下产生相同的结果(这就是我所描述的问题中第一次迭代成功的原因).该假设未在问题中明确说明,并为其他人提供了不太灵活的解决方案.

 

斯威夫特3和4等效

var subdata = sourceData.subdata(in: rangeStartByte ..< (rangeStartByte + subdataLength))
Run Code Online (Sandbox Code Playgroud)

Swift 2.2

(来自更新变量名称的问题的代码)

var subdata: NSData = NSMutableData.init(data: sourceData.subdataWithRange(NSRange.init(location: rangeStartByte, length: subdataLength)))
Run Code Online (Sandbox Code Playgroud)

 

可运行的示例代码

我已经包含了可以在游乐场中运行的示例代码,演示了如何使用这一行代码将Data实例分成更小的Data实例.源Data实例是从字符串创建的"ABCDEFGHIJKL".此实例分为Data长度为5的较小实例.

Swift 3和4与上下文

import UIKit

var sourceString = "ABCDEFGHIJKL"
let sourceData = sourceString.data(using: String.Encoding.utf8)!  // sourceData is equivalent to "wav" from question

var rangeStartByte = 0  // rangeStartByte is equivalent to "currentByte" from question
let maxSubdataLength = 5
let dataLength = sourceString.lengthOfBytes(using: String.Encoding.utf8)
precondition(maxSubdataLength <= dataLength, "maxSubdataLength must be <= to dataLength")

while rangeStartByte < dataLength {
    // subdataLength is equivalent to "wavDataSize" from question
    let subdataLength = min(maxSubdataLength, dataLength - rangeStartByte)

    // subdata is equivalent to "dataFile" from question
    let subdata = Data(sourceData.subdata(in: rangeStartByte ..< (rangeStartByte + subdataLength)))

    let subdataString = String(data: subdata, encoding: String.Encoding.utf8) ?? ""
    print("'\(subdataString)'")
    rangeStartByte += subdataLength
}
Run Code Online (Sandbox Code Playgroud)

结果是:

'ABCDE'
'FGHIJ'
'KL'
Run Code Online (Sandbox Code Playgroud)

 

Swift 2.2带有上下文

import UIKit

var sourceString = "ABCDEFGHIJKL"
let sourceData = sourceString.dataUsingEncoding(NSUTF8StringEncoding)!  // sourceData is equivalent to "wav" from question

var rangeStartByte = 0  // rangeStartByte is equivalent to "currentByte" from question
let maxSubdataLength = 5
let dataLength = sourceString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
precondition(maxSubdataLength <= dataLength, "maxSubdataLength must be <= to dataLength")

while rangeStartByte < dataLength {
    // subdataLength is equivalent to "wavDataSize" from question
    let subdataLength = min(maxSubdataLength, dataLength - rangeStartByte)

    // subdata is equivalent to "dataFile" from question
    let subdata: NSData = NSMutableData.init(data: sourceData.subdataWithRange(NSRange.init(location: rangeStartByte, length: subdataLength)))

    let subdataString = String(data: subdata, encoding: NSUTF8StringEncoding) ?? ""
    print("'\(subdataString)'")
    rangeStartByte += subdataLength
}
Run Code Online (Sandbox Code Playgroud)

结果是:

'ABCDE'
'FGHIJ'
'KL'
Run Code Online (Sandbox Code Playgroud)

 

使用NSRange的Swift 3和4

pedrouan的回答使用NSRange这样:

var subdata: Data = Data(sourceData.subdata(with: NSRange(location: rangeStartByte, length: subdataLength)))
Run Code Online (Sandbox Code Playgroud)

我最初无法编译,所以我忽略了它.现在我认识到它的工作原理,如果sourceData声明或投在NSDataData

如果您想在上面的"Swift 3&4 with context"示例代码中运行此方法,请使用以下代码替换该示例中的相应代码:

// subdata is equivalent to "dataFile" from question
let sourceNSData = sourceData as NSData
let subdata = sourceNSData.subdata(with: NSRange(location: rangeStartByte, length: subdataLength))
Run Code Online (Sandbox Code Playgroud)

我尽量不使用像NSRange这样的"NS"类,所以我赞成使用Swift Range的解决方案.


Max*_*pov 1

在 Swift 3 中,你的代码将如下所示:

var dataFile = sourceData.subdata(in: currentByte..<currentByte+wavDataSize)
Run Code Online (Sandbox Code Playgroud)