如何在 IOS 程序中使用 equalTo 方法
how to use equalTo method in IOS program
我对 iOS 块有疑问;
在 MASConstraint.h
(一个 iOS 第三方库)
有一个方法定义:
- (MASConstraint * (^)(id attr))equalTo ;
我找不到方法的参数,
但我可以看到很多人使用它:
[subViews mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
我不明白,因为我认为方法(equalTo 方法)没有形式参数。
但为什么代码 make.edges.equalTo(self.view)
是真的???
我需要你的帮助,非常感谢。
(MASConstraint * (^)(id attr))equalTo
是一个函数指针定义,return值为MASConstraint,它有一个参数,是一个'id'对象,可以表示任何对象类型,称为attr
所以equalTo是可变的,你可以像函数一样使用它,所以对于make.edges.equalTo(self.view),参数是self.view,而equalTo是returns MASConstraint 对象
方法(equalTo
方法)有形式参数,它有一个名为attr
的参数,参数是一个'id'对象。
由于block的格式非常难记,我个人比较喜欢用这个网站(http://fuckingblocksyntax.com)来帮助我记忆block的格式。该名称比块语法本身更容易记住:
http://fuckingblocksyntax.com
如果您无法加载包含不良词语的 URL,您可以使用此镜像:http://goshdarnblocksyntax.com
块声明语法列表
在整个过程中,让
return_type
是 object/primitive/etc 的类型。你想要return(通常是void
)
blockName
是您正在创建的块的变量名
var_type
是类型 object/primitive/etc。你想作为参数传递(没有参数留空)
varName
为给定参数的变量名
请记住,您可以根据需要创建任意数量的参数。
块作为变量
可能是最常见的声明。
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
作为属性的块
很像将块声明为变量,但略有不同。
@property (copy) return_type (^blockName) (var_type);
块作为参数
请注意,这与 "Blocks as Arguments" 不同;在这种情况下,您要声明一个需要块参数的方法。
- (void)yourMethod:(return_type (^)(var_type))blockName;
块作为参数
请注意,这与 "Blocks as Parameters" 不同;在这种情况下,您正在调用一个方法,该方法需要一个带有匿名块的块参数。如果您已经声明了一个块变量,将变量名作为参数传递就足够了。
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
匿名块
这在功能上是一个匿名块,但是将块分配给变量的语法只是将变量设置为匿名块。
^return_type (var_type varName)
{
//...
};
typedef
块
这允许您设置一个短名称,可以在块声明期间像任何其他 class 名称一样被引用。
typedef return_type (^blockName)(var_type);
稍后使用 blockName
而不是标准块声明语法,只需替换即可。
内联块
这可以说是对块的一种不太有用的利用,但仍然有其用武之地。内联块是在实例化后立即调用的匿名块。
^return_type (var_type varName)
{
//...
}(var);
内联块主要用于范围偏移,大致相当于简单的大括号分隔代码块。
{
//...
}
递归块
这允许您从自身调用块,创建可在回调和 GCD 调用期间使用的循环。此实例化方法在 ARC 中没有保留循环。
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
返回块
一个方法可以return一个块,
- (return_type(^)(var_type))methodName
{
// ...
}
函数也可以,只是有点奇怪。
return_type (^FunctionName())(var_type)
{
// ...
}
附录
如果我遗漏了什么,请在评论中告诉我,我会research/add他们。
哦,在 Swift...
blockName = (varName: var_type) -> (return_type)
这几乎就像是一种语言功能。
我对 iOS 块有疑问;
在 MASConstraint.h
(一个 iOS 第三方库)
有一个方法定义:
- (MASConstraint * (^)(id attr))equalTo ;
我找不到方法的参数,
但我可以看到很多人使用它:
[subViews mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
我不明白,因为我认为方法(equalTo 方法)没有形式参数。
但为什么代码 make.edges.equalTo(self.view)
是真的???
我需要你的帮助,非常感谢。
(MASConstraint * (^)(id attr))equalTo
是一个函数指针定义,return值为MASConstraint,它有一个参数,是一个'id'对象,可以表示任何对象类型,称为attr
所以equalTo是可变的,你可以像函数一样使用它,所以对于make.edges.equalTo(self.view),参数是self.view,而equalTo是returns MASConstraint 对象
方法(equalTo
方法)有形式参数,它有一个名为attr
的参数,参数是一个'id'对象。
由于block的格式非常难记,我个人比较喜欢用这个网站(http://fuckingblocksyntax.com)来帮助我记忆block的格式。该名称比块语法本身更容易记住:
http://fuckingblocksyntax.com
如果您无法加载包含不良词语的 URL,您可以使用此镜像:http://goshdarnblocksyntax.com
块声明语法列表
在整个过程中,让
return_type
是 object/primitive/etc 的类型。你想要return(通常是void
)blockName
是您正在创建的块的变量名var_type
是类型 object/primitive/etc。你想作为参数传递(没有参数留空)varName
为给定参数的变量名
请记住,您可以根据需要创建任意数量的参数。
块作为变量
可能是最常见的声明。
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
作为属性的块
很像将块声明为变量,但略有不同。
@property (copy) return_type (^blockName) (var_type);
块作为参数
请注意,这与 "Blocks as Arguments" 不同;在这种情况下,您要声明一个需要块参数的方法。
- (void)yourMethod:(return_type (^)(var_type))blockName;
块作为参数
请注意,这与 "Blocks as Parameters" 不同;在这种情况下,您正在调用一个方法,该方法需要一个带有匿名块的块参数。如果您已经声明了一个块变量,将变量名作为参数传递就足够了。
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
匿名块
这在功能上是一个匿名块,但是将块分配给变量的语法只是将变量设置为匿名块。
^return_type (var_type varName)
{
//...
};
typedef
块
这允许您设置一个短名称,可以在块声明期间像任何其他 class 名称一样被引用。
typedef return_type (^blockName)(var_type);
稍后使用 blockName
而不是标准块声明语法,只需替换即可。
内联块
这可以说是对块的一种不太有用的利用,但仍然有其用武之地。内联块是在实例化后立即调用的匿名块。
^return_type (var_type varName)
{
//...
}(var);
内联块主要用于范围偏移,大致相当于简单的大括号分隔代码块。
{
//...
}
递归块
这允许您从自身调用块,创建可在回调和 GCD 调用期间使用的循环。此实例化方法在 ARC 中没有保留循环。
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
返回块
一个方法可以return一个块,
- (return_type(^)(var_type))methodName
{
// ...
}
函数也可以,只是有点奇怪。
return_type (^FunctionName())(var_type)
{
// ...
}
附录
如果我遗漏了什么,请在评论中告诉我,我会research/add他们。
哦,在 Swift...
blockName = (varName: var_type) -> (return_type)
这几乎就像是一种语言功能。