Я скопировал ваш код, скачал пример файла json на свой рабочий стол и переименовал его в example_ 1.json (я включил пробел в имя файла).
import Foundation
// Set the file path
let path = "/Users/username/Desktop/example_ 1.json"
do {
// Get the contents
let contents = try String(contentsOfFile: path, encoding: .utf8)
print(contents)
}
catch let error as NSError {
print("Ooops! Something went wrong: \(error)")
}
Он успешно распечатал файл. Это также сработало, когда я определил содержимое как NSString.
let contents = try NSString(contentsOfFile: path,
encoding: String.Encoding.ascii.rawValue)
Я использую Swift 4.2.1
Во-первых, необходимо действительно возвратить ссылку из оператора + =, так как можно позже использовать их для реализации оператора +, оператора - и так далее. Я изменю это соответственно.
Кроме того, Ваш do_for_each должен быть шаблоном, так как он должен знать точный тип функционального объекта, поскольку объекты двоичной функции не являются классами полиморфа. Для фактической операции Вы хотите использовать std::transform
:
template<class T, unsigned int D>
class Vector {
public:
Vector& operator += (const T& value) {
do_for_each(std::plus<T>(), value);
return *this;
}
Vector& operator -= (const T& value) {
do_for_each(std::minus<T>(), value);
return *this;
}
Vector& operator *= (const T& value) {
do_for_each(std::multiplies<T>(), value);
return *this;
}
Vector& operator /= (const T& value) {
do_for_each(std::divides<T>(), value);
return *this;
}
private:
template<typename BinFun>
void do_for_each(BinFun op, const T& value) {
std::transform(data, data + D, data, std::bind2nd(op, value));
}
T data[D];
};
станд.:: преобразование просто передаст каждый элемент функциональному объекту и присваивает результат назад итератору, данному как третий аргумент.
Я думаю, что litb находится на корректной дорожке и ответил на точный вопрос.
Но я думаю, что это - неверное решение.
Я не использовал бы do_for_each (), а скорее использовал бы станд.:: преобразуйте () непосредственно:
template<class T, unsigned int D>
class Vector
{
public:
Vector& operator += (const T& value) {
std::transform(data, data + D, data, std::bind2nd(std::plus<T>(),value));
return *this;
}
Vector& operator -= (const T& value) {
std::transform(data, data + D, data, std::bind2nd(std::minus<T>(),value));
return *this;
}
Vector& operator *= (const T& value) {
std::transform(data, data + D, data, std::bind2nd(std::multiplies<T>(),value));
return *this;
}
Vector& operator /= (const T& value) {
std::transform(data, data + D, data, std::bind2nd(std::divides<T>(),value));
return *this;
}
private:
T data[D];
};
Необходимо действительно взглянуть на Операторы Повышения, библиотека только для заголовка, которая действительно упрощает создающие ортогональные и последовательные перегрузки арифметического оператора.
Конкретно: Вы могли бы найти то получение из boost::operators::integer_arithmatic<T>
сохраняет Вас большое повторение этого класса.