3

クラスのインスタンスに CGfloat 配列の値を設定できるように、プロパティを作成しようとしています。やり方が分からず一苦労。CGFloat には、以下のような「サイズ」[2] 変数と数値コンポーネントが必要です。

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

インスタンスからこれらの値を設定しようとしてプロパティを作成する前に、クラス自体でどのように見えるかを次に示します (これにより、UIView サンクラスの drawRect を介してグラデーション BTW が作成されます)。

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;

そして.mで

@synthesize locations;

しかし、[サイズ] とインスタンスのコンポーネントの値を適切に設定する方法がわかりません。また、プロパティを設定するとエラーが発生します: エラー: "互換性のない型 'const CGFloat *' (別名 'const float *') のパラメーターに 'CGFloat' (別名 'float') を渡します; & でアドレスを取得してください"

ここでプロジェクトを取得できます.tinyurl.com/cmgy482を見てみたいと思います.どんな助けでも大歓迎です.

4

3 に答える 3

4

ここにある別の回答から:「C配列は、プロパティでサポートされているデータ型の1つではありません」。それが私の問題だったと思います。私が使用した解決策は、プロパティを NSMutableArray にし、値を CGFloat に変換することです。

.h

@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];        
    } 

ビューコントローラー

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

    [myInstance setLocations:arrayPoints];

...
于 2012-07-25T09:44:18.907 に答える
3

理想的には、次のようにプロパティを宣言することができます。

@property (nonatomic) CGFloat locations[2];

残念ながら、clangでは配列型のプロパティを作成できません。

1つの代替方法は、代わりにポインター型を使用することです。おそらく、それが指す要素の数を説明するコメントを書きたいと思うでしょう。

#define kMyClassLocationCount 2

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

これを実装するには、インスタンス変数を作成し、getterとsetterを定義する必要があります。

@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;
于 2012-07-25T07:15:50.097 に答える
2

私はあなたがこのようなより良いコードを持っていたと思います:

NSArray * locations = [[NSArray alloc ] initWithObjects:[NSNumber numberWithFloat:1.0f],[NSNumber numberWithFloat:0.0f],nil];
于 2012-07-24T12:36:45.867 に答える