[英]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");
}
当我去打电话时,我得到了这样的花哨代码。
希望这能回答你的问题。
好了,所以我想通了,这样做的权宜方式简化版,导致警告/错误...... 而实际上使事情变得更容易阅读/短打字等
使用我们的“缩写”定义一个宏,然后在属性声明中使用完整格式,如...
#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.