Создание свойства из массива CGFloat - iOS

Попытка создать свойство, чтобы я мог установить значения массива CGfloat для экземпляра класса. Трудно понять, как это сделать. CGFloat должен иметь переменную "size" [2] и числовые компоненты, как показано ниже:

CGFloat locations[2] = {1.0, 0.0};

Вот как это выглядит в самом классе (это работает) до того, как я создал свойство в попытке установить эти значения из экземпляра (это создает градиент BTW через drawRect в солнцезащитном классе UIView):

CGContextRef context = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace=CGColorSpaceCreateDeviceRGB();
CGFloat locations[2] = {1.0, 0.0};
CGFloat components[8] = { 1.0, 0.0, 0.0, 1.0,  0.5, 0.25, 1.0, 1.0 };
CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, components,locations, num_locations);
CGContextDrawLinearGradient (context, myGradient, myStartPoint, myEndPoint, 0);

Я пытался создать свойство, как показано ниже в.h

@property (nonatomic, assign) CGFloat locations;

и в.м

@synthesize locations;

Но я не могу понять, как правильно установить значения для [размера] и компонентов из экземпляра. Также я получаю ошибки, когда устанавливаю свойство: ОШИБКА: "Передача" CGFloat "(он же" float ") параметру несовместимого типа" const CGFloat * "(он же" const float * "); взять адрес с &"

Вы можете получить проект здесь, вы чувствуете, что взглянуть на http://tinyurl.com/cmgy482 Любая помощь, высоко ценится.

3 ответа

Решение

Из другого ответа, найденного здесь: "C-массивы не являются одним из поддерживаемых типов данных для свойств". Я думаю, что это была моя проблема. Решение, которое я использовал, состоит в том, чтобы сделать свойство NSMutableArray и преобразовать значения в CGFloat.

.час

@property (nonatomic, retain) NSMutableArray *locations;

.m

CGFloat locationsFloat[[locations count]];

    for (int i = 0; i < [locations count]; i++) {
        NSNumber *number = [locations objectAtIndex:i];
        locationsFloat[i] = [number floatValue];        
    } 

ViewController

- (void)viewDidLoad
{
    NSMutableArray *arrayPoints = [[NSMutableArray alloc]init];    
    [arrayPoints addObject:[NSNumber numberWithFloat:1.0]];
    [arrayPoints addObject:[NSNumber numberWithFloat:0.0]];

    [myInstance setLocations:arrayPoints];

...

В идеале вы могли бы просто объявить свою собственность следующим образом:

@property (nonatomic) CGFloat locations[2];

Увы, clang не позволяет вам создать свойство с типом массива.

Одна альтернатива - использовать тип указателя. Вы, вероятно, хотите написать комментарий, чтобы объяснить, на сколько элементов он указывает:

#define kMyClassLocationCount 2

// This is an array of kMyClassLocationCount elements.  The setter copies
// the new elements into existing storage.
@property (nonatomic) CGFloat *locations;

Чтобы реализовать это, вам нужно создать переменную экземпляра и определить методы получения и установки:

@implementation MyClass {
    CGFloat _locations[kMyClassLocationCount];
}

- (CGFloat *)locations {
    return _locations;
}

- (void)setLocations:(CGFloat *)locations {
    memcpy(_locations, locations, kMyClassLocationCount * sizeof *_locations);
}

Обратите внимание, что вам не нужно @synthesizeпотому что вы явно определили все, что @synthesize может генерировать.

Когда вы используете экземпляр класса, вы можете прочитать отдельное местоположение, как это:

CGFloat location1 = myInstance.locations[1];

и вы можете установить индивидуальное местоположение, как это:

myInstance.locations[0] = 0.5;

и вы можете установить все местоположения одновременно так:

CGFloat newLocations[2] = { 7, 11 };
myInstance.locations = newLocations;

Я думаю, что у вас был лучший код, как это:

NSArray * locations = [[NSArray alloc ] initWithObjects:[NSNumber numberWithFloat:1.0f],[NSNumber numberWithFloat:0.0f],nil];
Другие вопросы по тегам