【问题标题】:method syntax in objective-c [duplicate]Objective-C中的方法语法[重复]
【发布时间】:2011-03-12 22:01:22
【问题描述】:

我是一名刚接触 Objective-c 的 .NET 程序员,我正在努力理解一些具体的语法。例如,我应该如何解析这个方法签名:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath {

我理解“-”字符的含义,并且 (UITableViewCell *) 定义了返回类型。但其余的让我感到困惑。

【问题讨论】:

  • objective-c 没有向函数“发送消息”的方法,存在重要的语义差异。一个例子是你不能安全地向 NIL 发送消息,但你不能在指向对象的空指针或对函数的空引用上调用方法
  • @fuzzy lollipop:实际上,您向 object 发送一条消息,然后它会调用一个方法。您不向函数发送消息。您可以安全地向 nil 发送消息。
  • 这就是我的意思 ;-)

标签: objective-c


【解决方案1】:
(1)      (2)          (3)            (4)         (5)             (6)                 (7)       (8)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  1. “-”定义实例方法
  2. 返回UITableViewCell指针
  3. 名为“tableView”的方法签名的第一部分
  4. 采用UITableView 指针
  5. 使用局部变量名“tableView”
  6. 方法签名的第二部分“cellForRowAtIndexPath”
  7. 采用NSIndexPath 指针
  8. 使用局部变量名称“indexPath”。

实际的方法签名是:tableView:cellForRowAtIndexPath:

【讨论】:

  • Objective-C 没有命名参数。
  • @bbum:是的,我知道,我已经更新了我的帖子,说“方法签名的一部分”而不是“命名的参数”以避免混淆。感谢您指出这一点。
  • 谢谢!这是我打败的一匹马,因为我看到太多人在尝试“删除关键字”或“命名参数”然后没有编译他们的代码时都感到困惑。
  • @AndyM:我感觉到你的痛苦,但你不能这样做,因为它会改变协议所依赖的方法的签名。
  • @AndyM:是的,你可以,但是(我会重申)它不会被本地协议调用。
【解决方案2】:

阅读 Apple 的文档,例如 Objective-C: A Primer。那里有解释。你知道,制造商(苹果或微软)在他们的网站上有很多文档......

【讨论】:

    【解决方案3】:

    Objective-C 为方法使用命名的内联参数。 (正如 bblum 在下面的评论中指出的那样,这种风格的参数有时被称为“交错”。)这反映了它作为 C 和 SmallTalk 语法的混合体的传统。结尾的冒号表示该方法的参数名称。对于您的方法,方法的全名称为tableView:cellForRowAtIndexPath:。它有两个参数,一个指向UITableView 的指针和一个指向NSIndexPath 的指针。在类似 java 的语言中,这个方法签名看起来像:

       public UITableViewCell cellInTableViewForRowAtIndexPath(UITableView tableView, NSIndexPath indexPath);
    

    【讨论】:

    • Objective-C 没有命名或关键字参数,它们被称为交错参数。这是一个重要的区别。命名或关键字意味着您可以删除部分名称。不正确。
    • @bblum - 我从来没有说过它使用关键字参数作为 Python 的关键字参数。我的意思是它们的命名是因为有一个名称与位置上的参数相关联。我试图使用对不熟悉该语言的人来说更容易理解的描述性术语。不过,我将编辑答案以包含您的术语。谢谢。
    • 谢谢。 “命名”和“关键字”都是混淆的根源,因此坚持避免使用它们。 (我无法告诉你我教过多少次 ObjC 课程让学生感到困惑,因为 setObject:forKey:setObject:forKey:setObject: 不同)
    【解决方案4】:

    每个foo:(bar)baz定义一个参数,例如

    - (id)initWithTitle:(NSString *)title
                message:(NSString *)message
               delegate:(id)delegate
      cancelButtonTitle:(NSString *)cancelButtonTitle
      otherButtonTitles:(NSString *)otherButtonTitles, ... {
    

    定义一个带有五个*参数的方法。

    : 之前的内容是方法名称的一部分。在这个例子中,方法的名字是

    initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:
    

    (…) 之间的内容是该参数的类型。在这里,我们看到第一个参数必须是NSString*

    最后是参数的名称。

    (*: 有时会有, ...,就像这里一样,表示它是可变参数方法。)

    在语法中调用方法

    id result = [theAllocedAlertView initWithTitle:@"title"
                                           message:@"message"
                                          delegate:someDelegate
                                 cancelButtonTitle:@"cancel button title"
                                 otherButtonTitles:@"other", @"button", @"titles", nil];
    

    所以方法的名称是重复的(按顺序!),参数名称被实际参数替换。

    在 C# 中,相应的函数签名如下所示

    object InitWithTitleAndMessageAndDelegateAndCancelButtonTitleAndOtherButtonTitles(
            string title,
            string message,
            object delegate,
            string cancelButtonTitle,
            params string[] otherButtonTitles);
    

    并像这样称呼

    object result = theAllocedAlertView.InitWithBlahBlahBlahAndOtherButtonTitles(
                       "title",
                       "message",
                       someDelegate,
                       "cancel button title",
                       "other", "button", "titles");
    

    【讨论】:

      【解决方案5】:

      方法选择器是:

      tableView:cellForRowAtIndexPath:

      冒号后面的每个值都是一个参数。签名的意思是读起来像一个英文句子,即“该索引处的一行的 TableView 的单元格”。

      【讨论】:

      • 那是方法的选择器,不是签名。选择器是方法的名称。签名为名称+所有参数信息。
      【解决方案6】:

      如果这是用另一种语言编写的,它可能看起来像这样

      // @param (UITableView *) tableView
      // @param (NSIndexPath*)indexPath
      // @return UITableViewCell
      - (UITableViewCell *) someFunctionName(tableView, indexPath) {
      
      }
      

      当然是粗略的说。在objective-c中不会这样写。但是我相信可以用 C++ 编写大部分程序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 2013-10-05
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 2013-09-16
        相关资源
        最近更新 更多