2012-02-02 11 views
28

Bir Objective-C blok özelliği tanımlamak mümkün, ancak Xcode 4'te tam kod tamamlama var mı?Xcode kod tamamlama ile Objective-C Block özelliği

typedef void (^CompletionBlock)(MyObject *myObj);

ve sonra özellik tanımlamak: Ben bloğu tanımlamak için bir typedef kullanırsanız

@property (nonatomic, copy) CompletionBlock completionBlock;

ve sonra @synthesize mülkiyet Tam kod alamadım setter çağırırken tamamlanma. Xcode typedef'i kullanacak ve bundan dolayı kod tamamlama, blok parametreleriyle birlikte eksiksiz blok sözdizimini kullanmaz, typedef'i kullanır.

yerine Typedef tam blok sözdizimini kullanan başlığında bir yöntem olup prototip tanımlarsak:

@property (nonatomic, copy) void (^completionBlock)(MyObject *myObj);

ve sonra @synthesize kullanımı, Resim ayarlayıcı tam kod tamamlama kullanılarak yakın geliyor Ben @synthesize ve çalışırsanız, Nihayet

[self setCompletionBlock:(void (^)(MyObject *)) { ... }

: sözdizimi ama en önemlisi o parametre isimleri dışarıda bırakır Daha sonra ayarlayıcı uygulama geçersiz kılmak veya başlığında prototip koyun:

- (void)setCompletionBlock:(void (^)(MyObject *myObj))completionBlock {...}

bir uyarı özelliği tipi erişimci türü eşleşmiyor belirten yükseltilir. Sözdizimini sonlandırmaya çalışmamın bir önemi yok, hem kod özelliği hem de kodun tamamlanması için tam sözdizimi olan bir belirleyici tanımlayamıyorum. Pastamı alabilir miyim ve ben de yiyebilir miyim?

Teşekkürler!

+0

sorusunu harkens ... bir cazibe gibi, çalışacak? Azaltılmış işlevsellik ve yarı yedek bir kod satırı için? Belki de bu Apple’ın demesidir ... ___ "bunu yapma!" ___ ?? –

cevap

32

Sınıf arayüzünüze ekstra bir kod satırı eklemeyi düşünüyorsanız, kekinizi kesinlikle yiyebilir ve yiyebilirsiniz.

İlk olarak bir typedef bloğu tanımlamak ve size söz konusu olduğu gibi bir özellik oluşturun:

typedef void (^CompletionBlock)(MyObject *myObj); 

... 

@property (nonatomic, copy) CompletionBlock completionBlock; 

Sonraki MobileOverload onun cevabını belirttiği gibi, biz 'Xcode typedef için doğru kod tamamlama sağladığını biliyoruz Bağımsız bir yöntem beyanında kullanıldığında d blokları. Yani, completionBlock ait setter için açık bir deklarasyon ekleyelim:

denilen
- (void)setCompletionBlock:(CompletionBlock)completionBlock; 

, bu yöntem özelliğiyle ilan kurucu metod olarak çözümlenir. Ancak, bunu açıkça sınıf arabiriminde tanımladığımız için Xcode bunu görür ve tam kod tamamlamasını uygular.

Yani, bu üç çizginin tümünü eklerseniz, istediğiniz sonucu elde etmelisiniz. Bu davranış açıkça Xcode'un bir kusurudur, çünkü bir @property deyiminde tanımlanmış bir setleyicinin, kendi başına tanımlanan aynı yönteme göre farklı kod tamamlanmasına neden olmasının bir nedeni yoktur. Tamam

+2

Bu, teşekkürler!Bunun için bir hata raporu göndeririz. Bu nedenle, gelecekte açık yöntem beyanına ihtiyaç duymayacağımıza inanıyorum. – Andrew

+0

Açık ayarlayıcı bildirimini arayüz dosyama eklerseniz, eksik bir uygulama olduğumu belirten bir proje uyarısı alırım. Bu ayarlayıcıyı arayüzde bildirirsem, bunu .m? – djibouti33

+0

Yalnızca bildirimde bulunmuyorsanız veya özellik tanımlayıcının belirttiğiniz tanımdan farklı bir tanımı varsa, bu uyarıyı almanız gerekir. – Matt

4

Sınıflarınızdaki bir yönteme bağımsız değişkenler olarak bloklarınızı geçirirken bazı güzel görünümlü kodlar alabilirsiniz. başlık dosyasında bu

typedef void (^MyCompletionBlock)(id obj1, id obj2); 

gibi blok Sonra ben de bu sınıf başlığında ilan ettiler benim yöntemine argüman olarak kullanmak başardı typedef. m dosyasında

-(void)doThisWithBlock:(MyCompletionBlock)block; 

Ben yöntemini

-(void)doThisWithBlock:(MyCompletionBlock)block { 
    NSLog(@"Something"); 
} 

ilan etti ve bunu aramaya gittiğinde ben böyle süslü kod tamamlama var. CodeCompletion1

CodeCompletion2

Umarım bu sorunuza yanıt.

+2

Maalesef bu davranış farklıdır ve Xcode, typedef bloğu türünde bir '@ property 'tanımladığınızda ve el ile tanımlanmış bir setter metodu kullandığında veya' @ synthesize'eat setter oluşturulduğunda tam blok sözdizimini kullanmaz. – Andrew

+2

Aynı konuya girdim. Xcode 4.3.2'den (4E2002) itibaren bu doğrudur. Arabirim bölümünde bir yazım hatası ve açık bir yöntem beyanı kullanmanız gerekir. Tam kodun tamamlanmasını istiyorsanız, özellik kullanmanın yanı sıra yazılan bir blok ile bir yöntemi tanımlamak mümkün değildir. – Klaas

+0

Bu Xcode içinde böyle bir STILL (4 sonra numara, bana cesaret, redaksiyon). UGH! –

0

Tam kod tamamlamalarını bilmiyorum, ancak kodun tamamlanmasını istediğiniz gibi tamamlamak için kod parçacıklarını kullanabilir ve kod tutkunları < #PLACE HOLDER #> içindeki yer tutucuları kullanabilirsiniz. Bu yardımcı olacağını umarız

1

yüzden uyarı/hatalara neden does't Bunu yapmanın geçici bir çözüm yolunu buldum ... ve aslında yapar şeyler kolay vb

tanımlamak, yazmak için/kısa okumak için sonra bizim "kısaltması" ve bir makro .. sonra referans verebilir sonradan ... özellik bildirimi gibi içinde

#define TINP NSString*(^)(NSString *typed, const char *raw) 
@interface .... 
@property (copy) NSString*(^termDidReadString)(NSString *typed, const char *raw); 

tam biçimi kullanın ve bu iddianın "tür", vb gibi ..

ve voilá ... sadece kodunuz TINIER olacak! ancak kod tamamlama neden `typedef` hiç ...

enter image description here

İlgili konular