簡體   English   中英

具有Xcode代碼完成的Objective-C Block屬性

[英]Objective-C Block Property with Xcode code completion

是否可以定義Objective-C塊屬性但在Xcode 4中仍然具有完整代碼完成?

如果我使用typedef來定義塊:

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

然后定義屬性:

@property (nonatomic, copy) CompletionBlock completionBlock;

然后@synthesize屬性我在調用setter時沒有得到完整的代碼完成。 Xcode將使用typedef,因此,代碼完成不使用完整塊語法完成塊參數,它使用typedef。

如果我在標頭中定義了一個使用完整塊語法而不是typedef的方法原型:

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

然后我使用@synthesize ,提供的setter接近使用完整的代碼完成語法,但關鍵是它省略了參數名稱:

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

最后,如果我嘗試@synthesize然后覆蓋setter實現或將原型放在標題中:

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

會出現一條警告,指出屬性類型與訪問者類型不匹配。 無論我如何嘗試使用語法,我都無法定義塊屬性和具有完整代碼完成語法的setter。 我可以吃蛋糕嗎?

謝謝!

如果你願意為你的類界面添加一行額外的代碼,你絕對可以吃蛋糕並吃掉它。

首先,使用typedef定義塊並像創建問題一樣創建屬性:

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

...

@property (nonatomic, copy) CompletionBlock completionBlock;

接下來,正如MobileOverload在他的回答中指出的那樣,我們知道如果在獨立的方法聲明中使用,Xcode為typedef'd塊提供了正確的代碼完成。 所以,讓我們為completionBlock的setter添加一個顯式聲明:

- (void)setCompletionBlock:(CompletionBlock)completionBlock;

調用時,此方法解析為屬性聲明的setter方法。 但是,因為我們在類接口中明確定義了它,所以Xcode會看到它並應用完整的代碼完成。

因此,如果您包含所有這三行,您應該得到所需的結果。 這種行為顯然是Xcode的一個缺點,因為沒有理由為什么@property語句中定義的setter應該具有與它自己定義的相同方法不同的代碼完成。

將塊作為參數傳遞給類中的方法時,可以獲得一些奇特的代碼完成。 在頭文件中,我像這樣鍵入了塊

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

然后我能夠使用它作為我的方法的參數,我也在這個類頭中聲明了。

-(void)doThisWithBlock:(MyCompletionBlock)block;

在m文件中我聲明了方法

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

當我去打電話時,我得到了這樣的花哨代碼。 CodeCompletion1

CodeCompletion2

希望這能回答你的問題。

好了,所以我想通了,這樣做的權宜方式簡化版,導致警告/錯誤...... 實際上使事情變得更容易閱讀/短打字等

使用我們的“縮寫”定義一個宏,然后在屬性聲明中使用完整格式,如...

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

隨后..你可以參考那種“善意”的論點等...

+ (void)addInputBlock:(TINP)termDidReadString;

並且瞧...你的代碼不僅會是TINIER !! 但代碼完成將起作用,就像一個魅力......

在此輸入圖像描述

我不知道完整的代碼完成,但你可以使用代碼片段來獲得代碼完成行為,你可以在代碼片段中使用占位符<#PLACE HOLDER#>。 希望對你有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM