Как компилятор говорит вам, что свойства не могут иметь тип массива или функции.
Вы можете вручную осуществить сорбент, как
@interface Matrix4 : NSObject {
float mat[16];
}
- (float *)mat;
@implementation
- (float *)mat {
return mat;
}
или вы можете рассмотреть возможность использования NSArray
вместо этого, в зависимости от ваших требований. NSArray
определенно имеет избыточный вес, чем собственный массив C, но он позволяет использовать свойства.
Однако я подозреваю, что у Вас есть вопрос дизайна: он выглядит, как вы пытаетесь реализовать прямоугольную матрицу, но вы подвергаете внутреннее представление, скорее всего, так что клиент может установить матричные элементы.
Вы должны скрыть внутреннее представление и только разоблачить методы для выполнения операций с матрицами.Например, вы можете думать о обнажая метод, который устанавливает значение матрицы, как:
- (void)setValue:(float)value forRow:(int)row column:(int)col {
NSParameterAssert(row >= 0 && row < 4 && col >= 0 && col < 4)
mat[row * 4 + col] = value;
}
и тот, который дает вам элемент назад
- (float)valueForRow:(int)row column:(int)col {
NSParameterAssert(row >= 0 && row < 4 && col >= 0 && col < 4)
return mat[row * 4 + col];
}
и сделать mat
Ивар приватным. Это дает вам также гибкость изменения внутреннего представления по своему усмотрению, не нарушая код клиента.
Вышеупомянутая реализация также очень легко обобщается на квадратную матрицу размера, предоставляя параметр измерения и используя NSArray
или динамическое распределение памяти (поскольку массивы переменной длины не могут быть ivars).
В первом предложении, которое вы даете, я получаю сообщение об ошибке «Тип свойства« мат »('float *') не соответствует типу переменной экземпляра 'mat' ('float [16]')", когда я пытаюсь для @synthesize. Или я не должен синтезировать его? Это произошло после удаления (только для чтения). Я предполагаю, что мне действительно нужно это как только для чтения, потому что есть много способов, по которым я хочу, чтобы матрица была настроена так, поэтому мне нужны специальные методы настройки с описательными именами. –
Также в чем разница между использованием float [16] и float [4] [4]? –
@MartiMarkov Да, не '@ синтезируйте', когда есть несоответствие. Разница между «[16]» и «[4] [4]» заключается в том, что последний передает значение двумерной матрицы 4 × 4, к которой можно получить доступ «mat [y] [x]», тогда как первая будет 'mat [y * 4 + x]'. – Arkku