方法作为参数类型
Method as a parameter type
学习JavaScript,我很好奇在Objective-C中是否有可能有一个具有参数类型的方法。下面是 findIndex() JavaStript 函数的示例,该函数返回数组中通过测试的第一个元素的索引(作为函数提供)。如果可能的话,Objective-C的块实现会是什么样子?
如果我在 NSArray 上编写一个类类别,我将如何将一个块传递给一个方法并在它本身 (NSArray) 上执行该条件。如果不可能,我很想知道为什么。
var ages = [3, 10, 18, 20];
function checkAdult(age) {
return age >= 18;
}
function myFunction() {
document.getElementById("demo").innerHTML = ages.findIndex(checkAdult);
}
这是我在另一个StackOverFlow问题中找到的一个有用的花絮,可能有助于块语法。我正在尝试实现的findIndex()函数的定义。
块语法
块作为方法参数模板
- (void)aMethodWithBlock:(returnType (^)(parameters))blockName { // your code }
例
-(void) saveWithCompletionBlock: (void (^)(NSArray *elements, NSError *error))completionBlock{ // your code }
块作为方法参数模板
[anObject aMethodWithBlock: ^returnType (parameters) { // your code }];
例
[self saveWithCompletionBlock:^(NSArray *array, NSError *error) { // your code }];
块作为局部变量**模板
returnType (^blockName)(parameters) = ^returnType(parameters) { // your code };
例
void (^completionBlock) (NSArray *array, NSError *error) = ^void(NSArray *array, NSError *error){ // your code };
阻止作为类型定义模板
typedef returnType (^typeName)(parameters); typeName blockName = ^(parameters) { // your code }
FindIndex()
定义
Array.prototype.findIndex ( predicate [ , thisArg ] )
注意谓词应该是一个接受三个参数和 返回一个可强制转换为布尔值 true 或 false 的值。 findIndex 为数组的每个元素调用一次谓词,在 升序,直到找到谓词返回 true 的顺序。如果 找到这样的元素,findIndex 立即返回 该元素值。否则,findIndex 返回 -1。
Objective-C 中的相应代码:
@implementation NSArray (MyExtension)
- (NSUInteger)findIndexWithPredicate:(BOOL (^)(id element, NSUInteger index, NSArray* array))predicate {
NSUInteger result = NSNotFound;
if (NULL != predicate) {
for (NSUInteger i = 0; i < self.count; i++) {
if (predicate(self[i], i, self)) {
result = i;
break;
}
}
}
return result;
}
@end
请注意,我已将默认返回值从 -1
更改为 NSNotFound
,因为索引是无符号的。
方法调用:
NSUInteger index = [@[@3, @10, @18, @20] findIndexWithPredicate:^BOOL(id element, NSUInteger index, NSArray *array) {
return [element integerValue] >= 18;
}];
您可以避免在 JavaScript 第一个索引中定义的额外参数:
@implementation NSArray (MyExtension)
- (NSUInteger)findIndexWithPredicate:(BOOL (^)(id element))predicate {
NSUInteger result = NSNotFound;
if (NULL != predicate) {
for (NSUInteger i = 0; i < self.count; i++) {
if (predicate(self[i])) {
result = i;
break;
}
}
}
return result;
}
@end
NSUInteger index = [@[@3, @10, @18, @20] findIndexWithPredicate:^BOOL(id element) {
return [element integerValue] >= 18;
}];
您可以使用enumerateObjectsUsingBlock:
方法在不编写自定义类别的情况下获得相同的结果:
[@[@3, @10, @18, @20] enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj integerValue] >= 18) {
*stop = YES;
index = idx;
}
}];
此外,还可以使用块的替代方法,例如 C 函数指针。但是块提供了更大的灵活性。
我确实为鲍里斯制定了类似的解决方案:
NSArray *ages = @[@"3", @"10", @"18", @"20"];
BOOL(^parameter)(NSInteger integer) = ^BOOL(NSInteger integer) {
if (integer >= 18) {
return YES;
}
return NO;
};
NSInteger(^block)(BOOL(^parameter)(), NSArray *array) = ^NSInteger(BOOL(^parameter)(), NSArray *array) {
for (NSUInteger i = 0; i < array.count; i++) {
NSInteger arrayInteger = [array[i] intValue];
if (parameter(arrayInteger) == YES) {
return i;
}
}
return -1;
};
NSInteger result = block(parameter, ages);
- 从查询字符串参数推断出正确的数据类型
- 为什么不'我们在javascript中使用函数参数的数据类型
- 如何确保函数/方法参数为certian类型
- 模版启动错误-类型错误(“参数”url'必须是字符串,而不是“+类型的url”)
- JS:执行'失败;getComputedStyle'在'窗口':参数的类型不是'
- 如何在谷歌电子表格脚本中测试范围参数的类型
- Angular 2:如何在 GET 和 POST 请求中设置 double、float、int 和布尔类型参数
- 收到错误:无法在“节点”上执行“appendChild”:参数 1 的类型不是“节点”
- Angular 2:HTTP Post Request,带有URL参数和正文类型参数
- PhpStorm警告:参数类型不可分配给参数类型
- 当数据类型为XML时,如何将url参数传递给AJAX jquery
- TypeScript-如何定义具有任何类型参数的函数类型
- AngularJS $http.post ASP.NET 具有简单类型参数的 Web API 控制器
- JavaScript 类型参数的有效性
- 获取引导预类型参数
- 错误TS2314:泛型类型'Promise<需要1个类型参数
- RegisterClientScriptInclude:什么是“类型”?参数
- Dojo 1.7 Dojo /on可以接受哪些字符串作为类型参数
- JavaScript's文档.打开支持MIME类型参数
- 流类型:泛型Id<T>具有与传入的类型参数类似约束的类型