cocoa 块中的 typedef
typedef in cocoa blocks
我对简单的Blocks和typedef有疑问。
考虑以下代码,我有一些 typedef 和两个方法,第二个被注释掉了。我的疑问是关于第一个。我应该使用这个吗?未来可能出现的任何问题或事情?
typedef void (^MySuccessBlock)(MyServiceResponse *response);
typedef void (^MyFailureBlock)(NSError *errorObject);
@property (nonatomic, copy)MySuccessBlock mySuccessBlock;
@property (nonatomic, copy)MyFailureBlock myFailureBlock;
//SHOULD I USE THIS?
- (void)myServiceWithCompletion:mySuccessBlock
failure:myFailureBlock;
//- (void)myServiceWithCompletion:(void (^)(MyServiceResponse *response))completion
// failure:(void (^)(NSError *errorObject))failure;
在实现文件中:
//If 1st one is used:
- (void)myServiceWithCompletion:aSuccessBlock
failure:aFailureBlock{
self.mySuccessBlock = aSuccessBlock;
self.myFailureBlock = aFailureBlock;
....
}
你应该使用这个:
- (void)myServiceWithCompletion:(MySuccessBlock)successBlock
failure:(MyFailureBlock)failureBlock;
请注意 MySuccessBlock
和 MyFailureBlock
开头的大写字母,与您的 typedef 相同。
事实上,当你声明时:
- (void)myServiceWithCompletion:mySuccessBlock
failure:myFailureBlock;
问题是因为您没有指定参数 'mySuccessBlock' 和 'myFailureBlock' 的类型。所以它们被视为默认类型 id
因为:
If a return or parameter type isn’t explicitly declared, it’s assumed
to be the default type for methods and messages—an id.
这就像你写:
- (void)myServiceWithCompletion:(id)mySuccessBlock
failure:(id)myFailureBlock;
id
type是指针,block是指针,所以不存在编译问题。但是由于黑色的参数和 return 值,您可能会遇到执行问题!
typedef 声明提供了一种创建别名的方法,可以在任何地方使用它来代替(可能很复杂的)类型名称。 See
您应该按以下方式使用typedef。
- (void)myServiceWithCompletion:(MySuccessBlock)aSuccessBlock
failure:(MyFailureBlock)aFailureBlock;
我对简单的Blocks和typedef有疑问。 考虑以下代码,我有一些 typedef 和两个方法,第二个被注释掉了。我的疑问是关于第一个。我应该使用这个吗?未来可能出现的任何问题或事情?
typedef void (^MySuccessBlock)(MyServiceResponse *response);
typedef void (^MyFailureBlock)(NSError *errorObject);
@property (nonatomic, copy)MySuccessBlock mySuccessBlock;
@property (nonatomic, copy)MyFailureBlock myFailureBlock;
//SHOULD I USE THIS?
- (void)myServiceWithCompletion:mySuccessBlock
failure:myFailureBlock;
//- (void)myServiceWithCompletion:(void (^)(MyServiceResponse *response))completion
// failure:(void (^)(NSError *errorObject))failure;
在实现文件中:
//If 1st one is used:
- (void)myServiceWithCompletion:aSuccessBlock
failure:aFailureBlock{
self.mySuccessBlock = aSuccessBlock;
self.myFailureBlock = aFailureBlock;
....
}
你应该使用这个:
- (void)myServiceWithCompletion:(MySuccessBlock)successBlock
failure:(MyFailureBlock)failureBlock;
请注意 MySuccessBlock
和 MyFailureBlock
开头的大写字母,与您的 typedef 相同。
事实上,当你声明时:
- (void)myServiceWithCompletion:mySuccessBlock
failure:myFailureBlock;
问题是因为您没有指定参数 'mySuccessBlock' 和 'myFailureBlock' 的类型。所以它们被视为默认类型 id
因为:
If a return or parameter type isn’t explicitly declared, it’s assumed to be the default type for methods and messages—an id.
这就像你写:
- (void)myServiceWithCompletion:(id)mySuccessBlock
failure:(id)myFailureBlock;
id
type是指针,block是指针,所以不存在编译问题。但是由于黑色的参数和 return 值,您可能会遇到执行问题!
typedef 声明提供了一种创建别名的方法,可以在任何地方使用它来代替(可能很复杂的)类型名称。 See
您应该按以下方式使用typedef。
- (void)myServiceWithCompletion:(MySuccessBlock)aSuccessBlock
failure:(MyFailureBlock)aFailureBlock;