Используйте AVAudioRecorder для записи:
private var audioRecorder: AVAudioRecorder!
После того, как вы объявили аудиорекордер, вы можете написать метод записи:
func startRecording() throws {
guard let newFileURL = createURLForNewRecord() else {
throw RecordingServiceError.canNotCreatePath
}
do {
currentFileURL = newFileURL
audioRecorder = try AVAudioRecorder(url: newFileURL,
settings: [AVFormatIDKey:Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 8000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue])
audioRecorder.delegate = self
audioRecorder.prepareToRecord()
audioRecorder.record(forDuration: TimeConstants.recordDuration)
} catch let error {
print(error)
}
}
И использовать некоторые вспомогательные методы и структуры:
enum RecordingServiceError: String, Error {
case canNotCreatePath = "Can not create path for new recording"
}
private func createURLForNewRecord() -> URL? {
guard let appGroupFolderUrl = FileManager.getAppFolderURL() else {
return nil
}
let fileNamePrefix = DateFormatter.stringFromDate(Date())
let fullFileName = "Record_" + fileNamePrefix + ".m4a"
let newRecordFileName = appGroupFolderUrl.appendingPathComponent(fullFileName)
return newRecordFileName
}
extension FileManager {
class func getAppFolderURL() -> URL? {
return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "you app bundle")
}
}
Только начните исправлять ошибки один за другим. Много ошибок просто располагается каскадом от начальных ошибок, таким образом, похоже, что существует много проблем, когда существует только пара. Только запустите с вершины:
1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class
Вы не можете инициализировать участника в определении класса, если это не статично, константа и один из целочисленных типов. Уезжайте"= 5
"прочь объявления number
. Затем у Вас должно будет быть определение Tester::number
за пределами определения класса, как так:
int Tester::number = 5;
Проблема № 2:
1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'
Почти точно, что это говорит (недостающие ошибки точки с запятой могут быть немного неточными в высказывании, где точка с запятой должна быть) - Вам нужна точка с запятой после определения Tester
класс.
Зафиксируйте их, и Ваши проблемы компиляции уходят.
Ключевая вещь состоит в том, чтобы попытаться взять ошибки компилятора по одному от вершины. Если Вы получаете больше, чем приблизительно 3 из них, можно, вероятно, просто проигнорировать все после приблизительно 3-го, потому что начальное ошибочное правое дело компиляция к в сорняки (и если они - реальные ошибки, они обнаружатся снова в следующей компиляции так или иначе).
const
модификатор к Вашему целому числу или перемещение инициализация вне класса (как в class Tester { static int number; }; int Tester::number = 5;
). Последний кажется более соответствующим Вашему случаю.class Tester { ... }
. Это должно быть class Tester { ... }
;
Другие ошибки, вероятно, вызываются предыдущей ошибкой. Они должны зафиксировать себя автоматически, когда это фиксируется.
Как примечание стороны, я не думаю, что Вы действительно хотите static
модификатор на Вашем участнике. Это кажется более подходящим для поля экземпляра. Вы все еще не можете инициализировать его оперативный, хотя (это не C#), необходимо переместить инициализацию к конструктору. Например:
class Tester {
int number;
static int staticNumber; // just to show you how to use a static field
public:
Tester() : number(5) {}
~Tester() {} // I suggest you remove the destructor unless you need it
int getNumber() { return number; }
void setNumber(int value) { number = value; }
static int getStaticNumber() { return staticNumber; }
static void setStaticNumber(int value) { staticNumber = value; }
};
// initialize static members *outside* the class
int Tester::staticNumber = 5;
Согласно этому: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr038.htm
Tester testerObject;
int Tester::number = 5;
Я не положителен, но я думаю, что остальная часть ошибок прибывает из той одной проблемы. Зафиксируйте это и посмотрите, как далеко это получает Вас.
ответы уже здесь имеют дело с тем, почему Ваш код не компилирует и как исправить это. однако я заинтригован Вашими комментариями об "экстерне". это очень просто в использовании, когда Вы знаете как. Вы объявляете в одном заголовке extern'ed переменную. и затем Вы инициализируете его в одном файле. любой другой файл может относиться к переменной включением заголовка. например.
header.h:
// ensure the file is only included once
#ifndef _HEADER_H
#define _HEADER_H
extern int foo;
#endif
// end file header.h
header.cpp
#include "header.h"
int foo = 1;
// end file header.cpp
main.cpp
#include "header.h"
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%d", foo);
return 0;
}
// end file main.cpp
Пока использование статических участников класса для глобальных переменных помогает соответствовать схеме дизайна oo, его более тщательно продуманному, чем необходимый. если Вы не должны следовать за oo строго, просто используйте экстерна, его более легкое и его меньше кода.