2011-08-16 10 views

cevap

81

tam burada devam, bu nedenle bu temel sorunun sebebini açıklamak olmayan diğer cevaplar:

Eğer blackKey.center.x, yazarken blackKey.center ve center.x hem yapı elemanı erişir gibi görünür, ama onlar' aslında tamamen farklı şeyler. blackKey.center, [blackKey center] gibi bir desugars'a karşılık gelen bir özellik erişimidir, bu da objc_msgSend(blackKey, @selector(center)) gibi bir şeye karşılık desugars'tır. objc_msgSend(blackKey, @selector(center)).x = 2 gibi bir işlevin dönüş değerini değiştiremezsiniz - sadece anlamlı değildir, çünkü geri dönüş değeri depolanmış her yerde anlamlı değildir.

Yapısını değiştirmek isterseniz, bir değişkenin özellik değerini döndürmeniz gerekir, değişkeni değiştirin ve sonra özelliği yeni değere ayarlayın.

+0

"anObject.anNonStructProperty.anProperty = someValue" öğesini ayarlayabiliriz. Bir fonksiyonun dönüş değerini değiştiremeyeceğimizi nasıl söylüyorsunuz? Açıklayabilir misin? – EmptyStack

+4

@EmptyStack: "anObject.someProperty = bir şey" yazdığınızda, bu [anObject someProperty] = bir şey 'ile eşdeğer değil - bunun yerine, [[birObject setSomeProperty: bir şey]' ile eşdeğerdir. Setter metodunu çağırmak için nesneye mesaj gönderiyorsunuz. Yöntemin dönüş değerini atamadınız. Bir ödevin ortaya çıkması sadece sözdizimsel bir şekerdir, tıpkı bir üye erişiminin görünüşü bir alıcı yöntemi için sözdizimsel şekerdir. – Chuck

+0

Hala net anlamıyorum. Cevabınızda bile, “blackKey.center” dahili olarak “objc_msgSend (blackKey, @selector (setCenter :))” ve “objc_msgSend (blackKey, @selector (orta))” olarak adlandırılır. – Adithya

10
blackKey.center = CGPointMake (whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y); 

bir yolu vardır.

19

CGPoint'un (veya bir yapının herhangi bir değeri) x değerini doğrudan, bir nesnenin bir özelliği ise değiştiremezsiniz. Aşağıdaki gibi bir şey yapın.

CGPoint _center = blackKey.center; 
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width); 
blackKey.center = _center; 
0

bir alternatif kullanılarak makro:

#define CGPOINT_SETX(point, x_value) { \ 
    CGPoint tempPoint = point;   \ 
    tempPoint.x = (x_value);   \ 
    point = tempPoint;     \ 
} 

#define CGPOINT_SETY(point, y_value) { \ 
    CGPoint tempPoint = point;   \ 
    tempPoint.y = (y_value);   \ 
    point = tempPoint;     \ 
} 

CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width); 

veya biraz daha basit: whiteKey.frame.origin.x + whiteKey.frame.size.width` 'ile aynıdır `bu

CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame)); 
+1

Gerçekten buna ihtiyacın var mı? (0) '? Blok kapsamı {...} 'temp değişkenlerini (potansiyel olarak adının hemen dışında bir şeyle çarpışma olmaksızın) bildirecek kadar yeterli değildir ve ifadeler tam olarak bir kez gerçekleştirilir mi? –

+0

@NicolasMiari 'do ... kullanırken (0)' uzun zamandır kullanıyorum ki, '{...} bloklarının gayet iyi çalıştığını fark etmedim. Teşekkürler. Basitleştirme. – ThomasW

+1

"Yapmak ..." (0) 'ın gerekçesi burada: http://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-cc-macros Benim durumum için gerekli değil, ama olduğu durumlar var. – ThomasW

İlgili konular