7
votes

Nsdata à Data Swift 3

var dataFile: NSData = NSMutableData.init(data: wav.subdataWithRange(NSRange.init(location: currentByte, length: wavDataSize)))
How to me convert this code to using Data with Swift 3? Or how to parseNSRange to Range

3 Réponses :


1
votes

Dans Swift 3, votre code sera comme celui-ci:

var dataFile = sourceData.subdata(in: currentByte..<currentByte+wavDataSize)


3 commentaires

Vous avez vérifié le lien dans la cour de jeu et vous avez écrasé avec une exception. Voir mon commentaire en réponse.


Cette réponse n'est pas équivalente au code de la question pour toutes les combinaisons de courances de courante et wavdatasize. Il est seulement équivalent lorsque CourantByte est 0 et wavdatasize est <= la longueur des données source. Ce n'était pas une hypothèse indiquée. Vous avez noté ma réponse s'est écrasée lorsque vous ne l'attendiez pas. C'était probable en raison d'hypothèses en dehors de la question. J'ai mis à jour ma réponse pour refléter mes hypothèses. C'est équivalent au code de question pour toutes les combinaisons de courances courantes et wavdatasize, y compris lorsqu'elle se bloque en raison des erreurs hors limites. Corrigez-moi si j'ai tort, s'il-vous plait. Salutations,


@Peacemoon, je pense que vous et moi interpréter la question de la même manière qui est plus générique. S'il vous plaît voir l'explication ajoutée dans ma réponse. Je vous remercie.



2
votes

Certains "petits" changements dans Swift 3.0 xxx


0 commentaires

11
votes

Séparer les données code> dans les données CODE> plus petites CODE> INSTANCES

SUPOMMESSES H2>

Cette réponse est l'équivalent Swift 3 et 4 du code dans la question. Il produira le même résultat, datafile code>, compte tenu des mêmes valeurs d'entrée: wav code>, actuelbyte code> et wavdatasize code> en supposant aucun des changements de code environnants. P>

Je n'ai pas fait d'hypothèses sur ce que les variables: wav code>, datafile code>, courantebyte code> ou wavdatasize code> moyenne. Pour éviter les noms de variables impliquant des choses non indiquées dans la question, je vais utiliser les noms suivants: SourceData ​​Code>, SubData ​​code>, RangESTARTBYTE > Longueur inférieure Code>. Je suppose que le code (non affiché dans la question) entourant cela assurerait que Rangestartbyte code> et subdatallength code> était dans une plage valide pour éviter une erreur. P>

P>

Conversion de Nsrange à la plage h2>

La mise en œuvre SWIFT 2 de la question utilise un nsrange code> défini par un point de départ et une longueur comme ceci:

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


2 commentaires

Votre code s'écrase avec: *** Application de terminaison en raison d'une exception non capturée 'NSRANgeException' en raison de la plage supérieure à la longueur de données.


@MAXPOTAPOVOV, le code de ma réponse donne le même résultat que le code de la question compte tenu des mêmes données source, de la même source, et de WAVDaTasize. Cela inclut des erreurs hors de portée. Je pense que nous avons des hypothèses différentes sur la question. J'ai mis à jour ma réponse pour inclure mes hypothèses. Je crois que ma réponse est valide et sera utile pour de nombreux développeurs rencontrant le même scénario que j'ai fait. Votre réponse se bloque également en fonction des entrées, mais il se bloque sur différentes combinaisons d'entrée que le code de la question. Ce n'est pas équivalent.