Ваша проблема может быть сведена к следующему:
let data = [1, 2, 3]
let data2 = [4, 5, 6]
let filteredData: [Int] = data
.map { [110] }
.append(contentsOf: data2.map { [110] })
Решение состоит в том, чтобы использовать конкатенацию вместо append
:
let data = [1, 2, 3]
let data2 = [4, 5, 6]
let filteredData: [Int] = data
.map { [111] }
+ data2.map { [111] }
Для объяснения это похоже на :
let a: Int = 0
let b = a += 1 // this is append
let c = (a + 1) += 1 // this is append with a temporary expression
(вы добавляете что-то, что немедленно отбрасывается, а значение не сохраняется в c
).
, что, очевидно, следует сделать как
let a: Int = 0
let b = a + 1
. Обратите внимание, что даже если бы вы могли append
использовать временное возвращаемое значение, append
не имеет возвращаемого значения, а ваш результат, назначенный filteredDataOpt
, быть Void
.
Причина, по которой временные выражения являются постоянными (неизменяемыми), заключается в том, чтобы не допустить подобных ошибок.
Внутренний класс является другом класса, в котором он определяется.
Так, да; объект типа Outer::Inner
может получить доступ к членской переменной var
из объекта типа Outer
.
В отличие от Java хотя, нет никакой корреляции между объектом типа Outer::Inner
и объектом родительского класса. Необходимо сделать отношения отцов и детей вручную.
#include <string>
#include <iostream>
class Outer
{
class Inner
{
public:
Inner(Outer& x): parent(x) {}
void func()
{
std::string a = "myconst1";
std::cout << parent.var << std::endl;
if (a == MYCONST)
{ std::cout << "string same" << std::endl;
}
else
{ std::cout << "string not same" << std::endl;
}
}
private:
Outer& parent;
};
public:
Outer()
:i(*this)
,var(4)
{}
Outer(Outer& other)
:i(other)
,var(22)
{}
void func()
{
i.func();
}
private:
static const char* const MYCONST;
Inner i;
int var;
};
const char* const Outer::MYCONST = "myconst";
int main()
{
Outer o1;
Outer o2(o1);
o1.func();
o2.func();
}
Внутренний класс имеет доступ ко всем членам внешнего класса, но он не имеет неявной ссылки на экземпляр родительского класса (в отличие от некоторой странности с Java). Таким образом, при передаче ссылки на внешний класс к внутреннему классу он может сослаться на что-либо во внешнем экземпляре класса.
Что-либо, что является часть Внешних, должно иметь доступ ко всем участникам Outer, общедоступным или частным.
Редактирование: Ваш компилятор корректен, var не является членом Внутренних. Но если у Вас есть ссылка или указатель на экземпляр Внешних, он мог бы получить доступ к этому.