ios – NSData to Data swift 3

前端之家收集整理的这篇文章主要介绍了ios – NSData to Data swift 3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. var dataFile: NSData = NSMutableData.init(data: wav.subdataWithRange(NSRange.init(location: currentByte,length: wavDataSize)))

如何将此代码转换为使用Swift 3数据?或者如何将NSRange解析为Range

解决方法

将数据分成较小的数据实例

假设

答案是Swift 3& 4个等效的问题代码.它将产生相同的结果dataFile,给定相同的输入值:wav,currentByte和wavDataSize,假设周围的代码没有变化.

我没有假设变量:wav,dataFile,currentByte或wavDataSize是什么意思.为避免变量名暗示问题中未说明的内容,我将使用以下名称:sourceData,subdata,rangeStartByte和subdataLength.我假设围绕此问题的代码(未在问题中显示)将确保rangeStartByte和subdataLength处于有效范围内以避免错误.

将NSRange转换为Range< Int>

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

  1. NSRange.init(location: rangeStartByte,length: subdataLength)

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

  1. rangeStartByte ..< (rangeStartByte + subdataLength)

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

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

  1. var subdata = sourceData.subdata(in: rangeStartByte ..< (rangeStartByte + subdataLength))

Swift 2.2

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

  1. var subdata: NSData = NSMutableData.init(data: sourceData.subdataWithRange(NSRange.init(location: rangeStartByte,length: subdataLength)))

可运行的示例代码

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

Swift 3& 4与上下文

  1. import UIKit
  2.  
  3. var sourceString = "ABCDEFGHIJKL"
  4. let sourceData = sourceString.data(using: String.Encoding.utf8)! // sourceData is equivalent to "wav" from question
  5.  
  6. var rangeStartByte = 0 // rangeStartByte is equivalent to "currentByte" from question
  7. let maxSubdataLength = 5
  8. let dataLength = sourceString.lengthOfBytes(using: String.Encoding.utf8)
  9. precondition(maxSubdataLength <= dataLength,"maxSubdataLength must be <= to dataLength")
  10.  
  11. while rangeStartByte < dataLength {
  12. // subdataLength is equivalent to "wavDataSize" from question
  13. let subdataLength = min(maxSubdataLength,dataLength - rangeStartByte)
  14.  
  15. // subdata is equivalent to "dataFile" from question
  16. let subdata = Data(sourceData.subdata(in: rangeStartByte ..< (rangeStartByte + subdataLength)))
  17.  
  18. let subdataString = String(data: subdata,encoding: String.Encoding.utf8) ?? ""
  19. print("'\(subdataString)'")
  20. rangeStartByte += subdataLength
  21. }

结果是:

  1. 'ABCDE'
  2. 'FGHIJ'
  3. 'KL'

Swift 2.2带有上下文

  1. import UIKit
  2.  
  3. var sourceString = "ABCDEFGHIJKL"
  4. let sourceData = sourceString.dataUsingEncoding(NSUTF8StringEncoding)! // sourceData is equivalent to "wav" from question
  5.  
  6. var rangeStartByte = 0 // rangeStartByte is equivalent to "currentByte" from question
  7. let maxSubdataLength = 5
  8. let dataLength = sourceString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
  9. precondition(maxSubdataLength <= dataLength,dataLength - rangeStartByte)
  10.  
  11. // subdata is equivalent to "dataFile" from question
  12. let subdata: NSData = NSMutableData.init(data: sourceData.subdataWithRange(NSRange.init(location: rangeStartByte,length: subdataLength)))
  13.  
  14. let subdataString = String(data: subdata,encoding: NSUTF8StringEncoding) ?? ""
  15. print("'\(subdataString)'")
  16. rangeStartByte += subdataLength
  17. }

结果是:

  1. 'ABCDE'
  2. 'FGHIJ'
  3. 'KL'

Swift 3& 4使用NSRange

pedrouan的回答使用NSRange这样:

  1. var subdata: Data = Data(sourceData.subdata(with: NSRange(location: rangeStartByte,length: subdataLength)))

我最初无法编译,所以我忽略了它.现在我意识到,如果在NSData而不是Data声明或转换sourceData,它会起作用

如果您想在上面的“Swift 3& 4 with context”示例代码中运行此方法,请将此示例中的相应代码替换为:

  1. // subdata is equivalent to "dataFile" from question
  2. let sourceNSData = sourceData as NSData
  3. let subdata = sourceNSData.subdata(with: NSRange(location: rangeStartByte,length: subdataLength))

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

猜你在找的iOS相关文章