var dataFile: NSData = NSMutableData.init(data: wav.subdataWithRange(NSRange.init(location: currentByte, length: wavDataSize)))
Run Code Online (Sandbox Code Playgroud)
如何将此代码转换为使用DataSwift 3?或如何解析NSRange到Range
Mob*_*Dan 11
Data成较小的Data情况下,这个答案是Swift 3和4相当于问题中的代码.在dataFile给定相同的输入值的情况下wav,它将产生相同的结果:currentByte并且wavDataSize 假设周围的代码没有任何变化.
我没有做假设,有关变量是什么:wav,dataFile,currentByte或wavDataSize意思.为了避免变量名暗示的东西的问题不说,我将使用下列名称改为:sourceData,subdata,rangeStartByte和subdataLength.我假设围绕此问题的代码(未在问题中显示)将确保rangeStartByte并且subdataLength在有效范围内以避免错误.
问题中的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实例的长度的特殊情况下产生相同的结果(这就是我所描述的问题中第一次迭代成功的原因).该假设未在问题中明确说明,并为其他人提供了不太灵活的解决方案.
var subdata = sourceData.subdata(in: rangeStartByte ..< (rangeStartByte + subdataLength))
Run Code Online (Sandbox Code Playgroud)
(来自更新变量名称的问题的代码)
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的较小实例.
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)
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)
pedrouan的回答使用NSRange这样:
var subdata: Data = Data(sourceData.subdata(with: NSRange(location: rangeStartByte, length: subdataLength)))
Run Code Online (Sandbox Code Playgroud)
我最初无法编译,所以我忽略了它.现在我认识到它的工作原理,如果sourceData声明或投在NSData不Data
如果您想在上面的"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的解决方案.
在 Swift 3 中,你的代码将如下所示:
var dataFile = sourceData.subdata(in: currentByte..<currentByte+wavDataSize)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14969 次 |
| 最近记录: |