2010-11-21 8 views
5

Ho tre domande che circondano quello che penso è l'argomento di struct in obj-cimpostazione e l'utilizzo di obj-c CGPoint, CGRect, e altri

1) Perché è che spesso (o sempre) Non ce la faccio un membro var che è un CGPoint o un CGRect e imposta i valori uno per uno? Trovo che devo fare:

CGPoint point; 
point.x = someValue; 
point.y = someOtherValue; 
obj.myPoint = point; 

invece di limitarsi a obj.myPoint.x = someValue ecc

2) Si tratta di un comportamento che è coerente in tutte le strutture in obj-c?

3) C'è un modo semplice per aggiungere due CGPoint? Sembra che ci dovrebbe già essere, ma non riuscivo a trovarne uno. Ho pensato che sarebbe stato ingombrante se avessi dovuto usare un CGPoint temporaneo per accumulare valori tra due CGPoints prima di impostare la variabile var alla variabile temp (a causa del fatto che non potevo semplicemente fare pointA.x + = pointB.x (stesso per y).

risposta

0

questo è perfettamente normale. l' 'obj' possiede che var e ha getter e setter, non è possibile modificare le parti di quella variabile.

la cosa migliore da fare è copiare l'struct e modificare quello che vi serve.

noti inoltre è possibile utilizzare la funzione di CGPointMake (x, y) (e lo stesso per tutte le strutture CG), che è molto più facile.

Per aggiornare questo è più facile:

CGPoint point = obj.myPoint; 
point.x += 10.0f; 
obj.myPoint = point; 

Obj-C 2.0 nasconde i getter e setter che assomiglia a questo:

CGPoint point = [obj myPoint]; 
point.x += 10.0f; 
[obj setMyPoint:point]; 
11

1) dal @sb in una risposta ad Cocoa Objective-c Property C structure assign fails

Ciò non comporterà nulla, perché [t member] restituisce una struct, che è un "valore-r", cioè. un valore valido solo per l'utilizzo sul lato destro di un compito. Ha un valore, ma non ha senso cercare di cambiare quel valore.

Fondamentalmente devi solo convivere con il fatto che non è possibile impostare direttamente i campi di struct quando vengono restituiti da una funzione.

2) Sì

3) Purtroppo non credo che ci sia un built-in metodo comodo per l'aggiunta di due CGPoint. Se trovate la vostra auto facendo questo spesso si può fare il vostro proprio:

CGPoint CGPointAdd(CGPoint p1, CGPoint p2) 
{ 
    return CGPointMake(p1.x + p2.x, p1.y + p2.y); 
} 

e poi utilizzarlo come:

obj.pointA = CGPointAdd(obj.pointA, pointB);

non elegante come obj.pointA.X += ..., ma a volte la vita non è giusto.