【问题标题】:How can I convert this dot notation to nested Objective-C brackets?如何将此点表示法转换为嵌套的 Objective-C 括号?
【发布时间】:2012-02-17 15:05:56
【问题描述】:

我试图不惜一切代价避免点符号,但我正在从一本几乎明确使用它的书中学习,所以当我在文本中看到它时,我一直在将它转换出来。然而,多个点连接在一起的符号仍然让我感到困惑。

有人可以将这两个解开成常规的括号方法并解释它是如何工作的,以便将来我可以自己转换出来吗?

self.tableView.tableHeaderView = searchBar;

self.searchBar.autocorrectionType = UITextAutocorrectionTypeYes;

【问题讨论】:

  • 为什么要避免使用点符号?与始终使用括号语法相比,它使代码更具可读性。
  • @yuji:这最终是一个见仁见智的问题。 :) 我不使用点语法,因为我发现隐含的访问器调用并不明显并且让我感到困惑,所以我避免使用它们。这只是个人选择。
  • 我必须部分同意 yuji,部分同意 quixoto :) 我更喜欢混合形式:这样一行中只有一对括号并且有明显的区别(对于老派的眼睛)在对象和发送给它的消息之间。
  • 它更多的是一个偏好问题,我一般是编程新手,我之前唯一的经验是使用大量 label1.text = "aabbcc" 的 VB,所以对我来说它只是有帮助我保持直截了当,我正在发送消息,访问方法等等..只是个人喜好..另外,我使用 Big Nerd Ranch 书进入了目标 c,它避免使用它并提出了一个很好的(恕我直言)论点为了避免它。 weblog.bignerdranch.com/?p=83

标签: objective-c ios methods


【解决方案1】:

您可以同时使用带点表示法的属性的 getter 和 setter。所以如何替换 for 表示法取决于你实际使用的是 getter(获取属性的值)还是 setter(设置属性的值)。

getter 是这样使用的:value = [object myProperty];

setter 是这样使用的:[object setMyProperty:value];

行内:

self.tableView.tableHeaderView = searchBar;

我们正在使用 setter 来修改对象 self.tableViewtableHeaderView 的值,因此可以将其替换为:

[self.tableView setTableHeaderView:searchBar];

可以替换为:(这次我们使用getter)

[[self tableView] setTableHeaderView:searchBar];

同理,可以这样写:

[self.searchBar setAutocorrectionType:UITextAutocorrectionTypeYes];

或者:

[[self searchBar] setAutocorrectionType:UITextAutocorrectionTypeYes];

【讨论】:

  • 好的,现在我看到了我的问题。我对 [self tableView] 是一 (1) 个对象这一事实感到困惑。我正在查看它,因为 tableView 是 self 的属性并且tableHeaderView 是 tableView 的一个属性。所以如果这发生在 -(void) viewDidLoad {} 方法中,那么 self 是视图吗?还是窗户?有什么区别?
  • viewDidLoad() 是视图控制器中的一个方法。所以 self 是具有 tableView 属性的视图控制器
【解决方案2】:

第一个是:

[[self tableView] setTableHeaderView: searchBar];

使用也没有什么问题:

[self.tableView setTableHeaderView: searchBar];

第二个:

[[self searchBar] setAutoCorrectionType: UITextAutocorrectionTypeYes];

这里你也可以使用:

[self.searchBar setAutoCorrectionType: UITextAutocorrectionTypeYes];

【讨论】:

  • 感谢您的回答,这里到底发生了什么?是自己访问tableview方法并设置了属于tableview方法的prop吗?
  • tableview 不是方法是对象,setTableHeaderView: 是 tableview 对象的方法,搜索栏是您作为参数传递给该方法的另一个对象。
  • @MBarnett:实际上是(在所有这些情况下,包括仅点的sintax)通过它的getter 获取tableview 并设置searchBar trough setter。当您使用表单“@synthesize table = _table”合成属性时,事情可能会有点混乱
  • @Matt 所以 self (viewDidLoad) 是一个视图控制器。这是否使它成为一个对象?如果是这样,它如何包含对象 tableView?我认为对象不能包含其他对象,只是指向它们的指针?
  • @MBarnett - 是的,视图控制器是一个对象,它是 UIViewcontroller 类(或其子类之一)的实例。属性视图是指向视图(定义为 UIView *view)的指针。
【解决方案3】:

为什么要“不惜一切代价避免点符号”?

我并不是说你应该使用点表示法,我只是说你应该有正当理由不这样做。

虽然我们正在讨论这个主题,但对所有内容都使用点表示法显然是滥用(如果这本书在任何地方都使用它在技术上是可行的,我想说这可能不是一本很好的书),但恕我直言吸气剂和二传手。这很好,因为您的代码已经告知读者被调用的方法是什么类型的方法。

(所以我会说 AutomaticBobRoss.paintAnImage 是误用,因为您正在调用一个目的是执行操作的方法 - 应该是 [AutomaticBobRoss paintAnImage] - 但 AutomaticBobRoss.lastImage 很好地使用点符号)

【讨论】:

  • 老实说,我认为消息传递语法是objective-c 最美妙的地方之一。此外,在进行 iOS/Cocoa 开发时,点表示法有双重用途:C 结构和 OO 结构,这可能会让人很困惑:[self bounds].size.width Vs self.bounds.size.width
  • 嗯,我猜这只是个人偏好。我必须同意 BNR 的家伙...weblog.bignerdranch.com/?p=83
  • @MBarnett 好吧,至少你有一本好书 :) 使用你喜欢的任何语法(只要它不是“我能用的点”;))
  • 大声笑,是的,强烈推荐这些人,我现在正在看的书是李伟猛的入门 ios,他到处使用它,所以.. 我认为撤消所有这些都是很好的做法复制示例时的点
  • @fzwo 也许更好的区别不是-paintAnImage 很昂贵,而是它的主要目的是做一些事情,而不仅仅是检索一个属性值。使用点符号来访问属性,但使用普通消息语法来发送其他类型的消息。将点语法与任何访问器一起使用是合理的,即使是昂贵的访问器。例如,访问someViewController.view 可能会很昂贵,因为可能必须加载 .xib。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2014-06-04
相关资源
最近更新 更多