向我解释这个obj-c方法签名

Ala*_*lan 0 objective-c

- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section
Run Code Online (Sandbox Code Playgroud)

我对obj-c很满意,但我不明白这种方法签名.特别是为什么这个方法在方法名称之前有所有额外的东西,以及它意味着什么.就像我得到的那样-是一个实例方法,返回类型是NSInteger

但为什么tableView: (UITableView *) tableView在方法名称前面呢?

为什么UITableViewDataSource协议的一些实例方法没有名称前面的东西?numberOfSectionsInTableView定义不同.

有人可以向我解释一下吗?

Lil*_*ard 9

让我们把它分解成几部分:

-
Run Code Online (Sandbox Code Playgroud)

这意味着它是一个实例方法.替代方法是+指类方法.

(NSInteger)
Run Code Online (Sandbox Code Playgroud)

这是方法的返回类型.在这种情况下它是NSInteger.

tableView:
Run Code Online (Sandbox Code Playgroud)

选择器名称的第一个组件(完整地tableView:numberOfRowsInSection:).该:说明一个参数如下.

(UITableView *)
Run Code Online (Sandbox Code Playgroud)

参数的类型.

tableView
Run Code Online (Sandbox Code Playgroud)

参数的名称.这在方法签名中基本上是无关紧要的(除了作为读者的目的提示),但在实现中,这是绑定到该参数的变量.

numberOfRowsInSection:
Run Code Online (Sandbox Code Playgroud)

选择器名称的下一个组件.

(NSInteger)
Run Code Online (Sandbox Code Playgroud)

第二个参数的类型.

section
Run Code Online (Sandbox Code Playgroud)

第二个参数的名称.


请注意,在这一整条生产线中唯一必需的空间之间的一个tableViewnumberOfRowsInSection:.所有其他空间都可以省去生产

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
Run Code Online (Sandbox Code Playgroud)

虽然您会发现最常见的格式如下:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
Run Code Online (Sandbox Code Playgroud)

编辑:看起来对于问题的后半部分仍然存在一些混淆.tableView:选择器的组件用于提供UITableView*询问问题的实例.UITableViewDataSource协议中的所有方法都将发送tableview作为参数.其中一些方法有其他参数,有些则没有.具有附加参数的那些都被格式化为tableView:someOtherThing:(例如tableView:numberOfRowsInSection:),但这不是必需的.它可以被称为numberOfRowsInTableView:forSection:,或者numberOfRowsInSection:ofTableView:甚至foo:bar:,但它是API开发人员为了保持一致的命名方案而做出的风格选择,该方案有助于开发人员和稍后阅读代码的人员.对于不带任何其他参数的方法,它们看起来像是numberOfSectionsInTableView:因为这只是方法的自然名称.它们无法被调用,tableView:numberOfSections因为它是非法的选择器(第一个之后的所有组件必须具有关联的参数,因此必须具有尾随:).