Я пытаюсь создать массив атрибутов вершин для хранения векторов и индексов в сетке. Я понимаю, что атрибуты вершин могут быть составлены из vector2, vector3 и/или vector4, поэтому я хотел бы создать класс, который обслуживает их всех без ограничения методов для возврата определенного типа объекта. В качестве теста я написал следующий класс использования решений в NSMutableData
:Как назначить разные типы данных для NSMutableData
//VertexAttributeArray.h
@interface VertexAttributeArray : NSObject
{
NSMutableData *vertexData;
}
- (void *)data;
- (CGRect *)rect;
//VertexAttributeArray.m
- (id)init
{
self = [super init];
if(self)
{
vertexData = [[NSMutableData alloc] initWithLength:0];
}
return self;
}
- (void *)data
{
return [vertexData mutableBytes];
}
- (CGRect *)rect
{
return [vertexData mutableBytes];
}
- (void)dealloc
{
if(vertexData)
{
[vertexData release];
vertexData = nil;
}
[super dealloc];
}
Изнутри моего класса сетки, я хотел бы быть в состоянии назвать что-то вроде:
VertexAttributeArray *vertexAttributeArray = [[VertexAttributeArray alloc] init];
[vertexAttributeArray data][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //doesn't work - compiler error
[vertexAttributeArray rect][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //works fine
Первый метод, получающий доступ к data
, был бы предпочтительнее, поскольку это не ограничивает класс работой с определенным типом структуры, но Xcode просто выдает предупреждение «Неполный тип« void »не присваивается».
Я не хочу иметь несколько методов для различных типов структур данных, но я не вижу никакого способа обойти это сейчас. Наличие методов, возвращающих указатели на разные типы, выглядит не очень элегантно и добавляет много рудиментарного неиспользуемого (и нежелательного) кода.
Есть ли способ обойти это для создания агностического хранилища данных? Я бы предпочел, чтобы мой класс mesh имел разные объекты VertexAttributeArray
для хранения вершин, индексов, нормалей и цветов и т. Д., Поэтому сохранение векторов2, vector3 и vector4 идеально, где бы я хотел быть. Как я буду работать над достижением этого?
Замечательный. Я думал, что так может быть. Большое спасибо за ваш ответ. – CaptainRedmuff