#arrays #swift #txt
#массивы #swift #txt
Вопрос:
Прежде всего: я действительно хочу сохранить массив как .txt
файл. .plist
об этом не может быть и речи.
Причина: после этого я хочу сохранить его в вектор, используя C . Осознание этого с помощью оболочки уже сводило меня с ума.
Вот мой код:
guard let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: AVAudioFrameCount(file.length))
else{ throw NSError()}
try file.read(into: buf)
guard buf.floatChannelData != nil else{print("Channel Buffer konnte nicht erstellt werden")
throw NSError()}
let samples = Array(UnsafeBufferPointer(start:buf.floatChannelData![0],count:Int(buf.frameLength)))
var wData = Data(samples)
try! wData.write(to: outputURL())
Но инициализировать данные значениями с плавающей запятой невозможно или нет?
Как я могу записать массив значений с плавающей запятой в .txt
файл?
Комментарии:
1. почему бы вам просто не закодировать его с помощью
JSONEncoder
?2. Вы также можете сохранить его необработанные байты
3. @LeoDabus У меня еще не было никакого контакта с кодировщиком JSON. Как это сделать?
Ответ №1:
Ответ на сам вопрос (сохраните его как txt), вы можете сохранить свой массив с плавающей запятой в виде строки JSON. Должно быть довольно просто кодировать и декодировать его с помощью JSONEncoder / JSONDecoder.
let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let encoded = try! JSONEncoder().encode(values)
print(String(data: encoded, encoding: .utf8)!) // "[-3.1415925025939941,0,3.1415925025939941,1.5,2.5]n"
let decoded = try! JSONDecoder().decode([Float].self, from: encoded) // [-3.141593, 0, 3.141593, 1.5, 2.5]
«Но инициализировать данные значениями с плавающей запятой невозможно или нет?»
Да, если определенно возможно преобразовать массив с плавающей запятой в данные / байты и прочитать его обратно. Также предпочтительно сохранять точные значения, избегая преобразования в строку:
extension Array {
var bytes: [UInt8] { withUnsafeBytes { .init($0) } }
var data: Data { withUnsafeBytes { .init($0) } }
}
extension ContiguousBytes {
func object<T>() -> T { withUnsafeBytes { $0.load(as: T.self) } }
func objects<T>() -> [T] { withUnsafeBytes { .init($0.bindMemory(to: T.self)) } }
}
let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let bytes = values.bytes // [218, 15, 73, 192, 0, 0, 0, 0, 218, 15, 73, 64, 0, 0, 192, 63, 0, 0, 32, 64]
let data = values.data // 20 bytes
let minusPI: Float = data.subdata(in: 0..<4).object() // -3.141593
let loaded1: [Float] = bytes.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]
let loaded2: [Float] = data.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]
Комментарии:
1. Вау, это уже работает довольно хорошо. Я написал эту строку после кодирования:
try encoded.write(to: outputURL())
И я получаю текстовый файл с желаемыми значениями.2. @HannesBroschk Рад помочь