你如何调整 Xcode 的 Objective C 参数的自动缩进?

Posted

技术标签:

【中文标题】你如何调整 Xcode 的 Objective C 参数的自动缩进?【英文标题】:How do you Tweak Xcode's auto-indentation of Objective C Parameters? 【发布时间】:2012-01-05 09:51:40 【问题描述】:

这是我的 ios 应用中的一段代码:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Do you like my hat?"
                                                    message:@"If so, please help spread the word by rating our app now?"
                                                   delegate:nil
                                          cancelButtonTitle:@"No Thanks"
                                          otherButtonTitles:@"Sure!", @"Maybe Later", nil
                          ];

为什么 Xcode 缩进这么多行?作为一个古老的 Perl、Ruby 和 javascript 猴子,我更倾向于像这样手动缩进它:

    UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:     @"Do you like my hat?"
        message:           @"If so, please help spread the word by rating our app now?"
        delegate:          nil
        cancelButtonTitle: @"No Thanks"
        otherButtonTitles: @"Sure!", @"Maybe Later", nil
    ];

所以参数名称和值都是左对齐的,并且只缩进一级(我是 4 个空格)。这使用的屏幕空间要少得多,而且我不太可能需要在 MacBook Air 上处理换行(这使得极右缩进的内容更难阅读)。

但是,我认为 Apple 更喜欢第一种方法是有原因的,因此 Xcode 采用这种方式缩进。或者有吗?

所以我有两个问题:

您更喜欢如何在 Objective C 代码中缩进方法参数? 如何调整 Xcode 以使用您喜欢的缩进样式进行格式化?

不想在这里发动圣战;我更好奇的是 Objective-C 程序员中的最佳实践,Xcode 如何帮助这些实践,以及找出 Xcode 的默认方式是否有充分的理由。


更新: 评论者和回答指出,默认格式将参数与冒号对齐。我应该在发帖之前记住这一点,因为我当然注意到了,当最长的项目没有太多缩进时,它看起来很漂亮。但我发现,通常情况下,最长的项目 缩进很多。例如:

UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Do you like my hat?"
                                message:@"If so, please help spread the word by rating our app now?"
                               delegate:nil
                      cancelButtonTitle:@"No Thanks"
                      otherButtonTitles:@"Sure!", @"Maybe Later", nil
                      ];

这是为什么呢?即使我希望它们在冒号处对齐(​​而且我经常手动格式化它们),缩进这么多似乎很愚蠢。为什么它坚持缩进到开头冒号的水平?为什么不只是一个缩进级别,右括号向外缩进以显示缩进“块”的结尾?例如:

UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:@"Do you like my hat?"
              message:@"If so, please help spread the word by rating our app now?"
             delegate:nil
    cancelButtonTitle:@"No Thanks"
    otherButtonTitles:@"Sure!", @"Maybe Later", nil
];

这似乎比the Google style guide's line length recommendation 更好,不是吗?

有没有办法调整 Xcode 以这种方式格式化参数?

【问题讨论】:

“你喜欢如何缩进...”是not a good *** question。至于“你如何调整 Xcode ...”,没有任何选项可以让它自动缩进不同的多行选择器。 FWIW,您可以通过在 init 之前添加换行符来获得与您想要的类似的行为。它会自动缩进以排列冒号。 @robmayoff:很好,谢谢。我已经更新了问题。 @jrturton:是的,我应该在发帖之前记住这一点,所以我添加了一个更新来解决这个问题。恕我直言,它似乎仍然缩进太多。 使用 AppCode。它在开发者功能和“开发者乐趣”方面遥遥领先于 Xcode,JetBrains 跨多种语言和生态系统构建 IDE 的经验远远超过 Apple 团队(或 Microsoft 或 Xamarin)的经验。是的,“ASCII 艺术”是一种代码风格的反模式。使用 Xcode 的默认样式,如果您在方法中重命名参数,则必须重新格式化整个项目,相邻行也会受到影响。显然,理解恒定/轻松重构和为您执行重构工作的现代工具的价值的人不会选择这种理念。 【参考方案1】:

1) 给定多个参数时,Objective-c 缩进约定在冒号处对齐。

例子

功能:

- (void)functionWithOne:(NSString *)one two:(NSString *)two tree:(NSString *)three;

必须格式化为:

- (void)functionWithOne:(NSString *)one 
                    two:(NSString *)two 
                  three:(NSString *)three;

我来自 Java,一开始我真的很难适应。但是在尝试了几次之后,这确实是最好的方法。

2) 我不认为(我不确定)您可以在 xcode 中更改它。 Apple 的约定非常清楚。

编辑: 调用。我个人从第一个参数开始,然后将其余参数对齐:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Do you like my hat?"
                                                message:@"If so, please help spread the word by rating our app now?"
                                               delegate:nil
                                      cancelButtonTitle:@"No Thanks"
                                      otherButtonTitles:@"Sure!", @"Maybe Later", nil];

【讨论】:

是的,这在我看来对方法声明很有效,但对调用无效。 是的,但这是一个疯狂的深缩进,并且对窄屏幕不友好(例如在我的 MacBook Air 上的 Xcode 中)。 确实如此。我认为 xcode 适用于高分辨率宽屏用户:P。我在 MacBook Pro 15" 上编程,但我仍然认为我需要宽度。我仍然想要 iMac 27":P【参考方案2】:

我不确定如何在 Xcode 中对其进行格式化,但代码格式化工具的两个选项是:

    使用Uncristify,有一个GUI工具可以配置它:UncrustifyX 使用 Jetbrains 的 iOS/OSX IDE AppCode - 它具有可配置和内置格式。见截图。

【讨论】:

以上是关于你如何调整 Xcode 的 Objective C 参数的自动缩进?的主要内容,如果未能解决你的问题,请参考以下文章

『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

如何在Objective C中设置Xcode 8中的约束

如何在 Objective C 中的 Xcode 8 中设置约束

如何用XCode创建Objective-c和C++的混编工程?

如何直接为警报注册通知,而不仅仅是横幅? XCode 中的 Swift 或 Objective C

如何让 XCode 构建一个包含 Objective-C++ 的项目?