- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section
Run Code Online (Sandbox Code Playgroud)
我对obj-c很满意,但我不明白这种方法签名.特别是为什么这个方法在方法名称之前有所有额外的东西,以及它意味着什么.就像我得到的那样-是一个实例方法,返回类型是NSInteger
但为什么tableView: (UITableView *) tableView在方法名称前面呢?
为什么UITableViewDataSource协议的一些实例方法没有名称前面的东西?numberOfSectionsInTableView定义不同.
有人可以向我解释一下吗?
让我们把它分解成几部分:
-
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)
第二个参数的名称.
请注意,在这一整条生产线中唯一必需的空间之间的一个tableView和numberOfRowsInSection:.所有其他空间都可以省去生产
-(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因为它是非法的选择器(第一个之后的所有组件必须具有关联的参数,因此必须具有尾随:).