Создание свойства из массива 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];