gpt4 book ai didi

ios - 带有 Xcode 代码完成的 Objective-C block 属性

转载 作者:IT王子 更新时间:2023-10-29 07:47:35 26 4
gpt4 key购买 nike

是否可以定义 Objective-C block 属性但在 Xcode 4 中仍然具有完整代码完成?

如果我使用 typedef 来定义 block :

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

然后定义属性:

@property (nonatomic, copy) CompletionBlock completionBlock;

然后是 @synthesize 调用 setter 时我没有获得完整代码完成的属性。 Xcode 将使用 typedef,因此,代码完成不使用带有 block 参数的完整 block 语法,而是使用 typedef。

如果我在 header 中定义了一个使用完整 block 语法而不是 typedef 的方法原型(prototype):

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

然后我使用 @synthesize,提供的 setter 接近于使用完整的代码完成语法,但关键是它省略了参数名称:

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

最后,如果我尝试 @synthesize 然后重写 setter 实现或将原型(prototype)放在 header 中:

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

发出警告,指出属性类型与访问器类型不匹配。无论我如何尝试欺骗语法,我都无法同时定义 block 属性和具有代码​​完成完整语法的 setter 。我可以吃我的蛋糕吗?

谢谢!

最佳答案

如果您愿意在您的类界面中添加一行额外的代码,您绝对可以吃蛋糕和吃它。

首先,使用 typedef 定义 block 并像您在问题中所做的那样创建一个属性:

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

...

@property (nonatomic, copy) CompletionBlock completionBlock;

接下来,正如 MobileOverload 在他的回答中指出的那样,我们知道如果在独立的方法声明中使用,Xcode 会为 typedef block 提供正确的代码完成。因此,让我们为 completionBlock 的 setter 添加一个显式声明:

- (void)setCompletionBlock:(CompletionBlock)completionBlock;

调用时,此方法解析为属性声明的 setter 方法。但是,因为我们在类接口(interface)中显式定义了它,所以 Xcode 会看到它并应用完整的代码完成。

因此,如果您包括所有这三行,您应该会得到想要的结果。这种行为显然是 Xcode 的一个缺点,因为没有理由为什么在 @property 语句中定义的 setter 应该具有与其自身定义的相同方法不同的代码完成。

关于ios - 带有 Xcode 代码完成的 Objective-C block 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com