【问题标题】:How to autocomplete enum switch using Xcode?如何使用 Xcode 自动完成枚举切换?
【发布时间】:2014-04-01 13:19:13
【问题描述】:

假设你有一个枚举:

typedef enum {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
} DayOfWeek;

在编写 switch 语句时,Xcode 试图帮助 switch 语句 sn-p:

然后:

很好,但我需要列出所有枚举:

DayOfWeek day = ...; // a day of week
switch (day) {
    case Sunday:
        break;
    case Monday:
        break;
    case Tuesday:
        break;
    case Wednesday:
        break;
    case Thursday:
        break;
    case Friday:
        break;
    case Saturday:
        break;
    default:
        break;
}

不幸的是,必须手动完成 :( 是否有任何已知的 sn-p 来填充所有案例? 当然,我看到一些 3 岁的回答说这是不可能的,但也许从那时起发生了一些变化?有什么想法吗?

【问题讨论】:

  • 考虑使用来自 JetBrains 的 AppCode jetbrains.com/objc/features : Intention Actions - Multiple intention actions are there to improve your code, or make some routine work easier. They allow you to create symbols from usage, declare methods, swap parts of a boolean expression, merge nested 'if's, **generate switch cases**, and so on.
  • 开箱即用的 Xcode 无法做到这一点。提交错误报告并请求改进。 bugreport.apple.com
  • @Jeff 您应该将您的评论推广为答案。
  • 谢谢@diogot,完成了。

标签: ios xcode enums


【解决方案1】:

简答:

使用Editor > Refactor > Add Missing Switch Cases

方便的方式:

  1. 在 Xcode 中按 [command] + [,] 打开 Preferences
  2. 转到Key Bindings 选项卡并为命令Refactor > Add Missing Switch Cases 设置快捷方式。
  3. 在编辑器中输入快捷方式。确保光标位于switch 字母上。

【讨论】:

    【解决方案2】:

    它不使用 Xcode,但您可以使用任何脚本语言非常快速地生成处理过的 sn-ps。也可以将其作为插件放入您最喜欢的文本编辑器中(例如 Textmate)。

    我有一个 ~/bin 文件夹,我可以在其中放置这样的助手和 chmod +x 他们,这样我就可以像这样随时使用:

    enumify.pl ~/tmp.txt

    甚至更好地使用命令行粘贴板工具:

    pbpaste | enumify.pl

    #! /usr/bin/perl
    
    #enumify.pl
    
    #reads from STDIN or use filename as first arg
    #on OS X combine with pbpaste e.g pbpaste | enumify.pl
    
    sub  trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
    
    my @lines;
    
    $filename = $ARGV[0];
    
    if (length($filename) > 0) {
    
        { local *FILE; open FILE, "<$filename"; @lines = <FILE>; close FILE }
    
    } else {
    
        @lines = <STDIN>;
    }   
    
    
    if (scalar @lines) {
    
        my $target = "switch(<#switchvar#>) {\n";
    
        my $enumlock = 0;
    
        foreach (@lines) {
    
            if ($enumlock == 0 && m/enum/) {
                $enumlock = 1;
            }
            elsif ( $enumlock == 1) {
    
                $_ = trim($_);
    
                if (!(m/[{}]/) && (length($_)>0)) {
                    $_ =~ s/,//;
                    $target = "$target case $_:\nbreak;\n";
                }
            }
        }
    
        $target = "$target default:\nbreak;\n}\n";
    
        if ( $enumlock == 1) {
            print $target;
        }
    
    }
    

    转身

    typedef enum {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    } DayOfWeek;
    

    进入

    switch(<#switchvar#>) {
        case Sunday:
            break;
        case Monday:
            break;
        case Tuesday:
            break;
        case Wednesday:
            break;
        case Thursday:
            break;
        case Friday:
            break;
        case Saturday:
            break;
        default:
            break;
    }
    

    【讨论】:

      【解决方案3】:

      只需点击“修复”按钮,案例就会出现:

      【讨论】:

        【解决方案4】:

        在 Xcode 10 中执行以下操作

        1. 添加 switch...case 模板并设置您的枚举类型而不是 self 以便 xcode 了解它应该自动完成的内容

        1. 将光标移到单词switch 中并转到menu &gt; editor &gt; refactor &gt; expand switch cases

        这就是你将得到的结果

        【讨论】:

        • 这很好用。我找不到为此创建快捷键的任何可能性。所有其他重构选项都是可配置的,但不是这个。你能找到一种可能吗?
        • 嘿@PhilippOtto!我也在寻找一种为此添加快捷方式的方法,你有没有发现什么有用的东西?
        • @MuhamedAlGhzawi 很遗憾没有
        • 与 Xcode 11.3.1 配合得很好,但我们必须将光标放在切换词上。
        【解决方案5】:

        嘿,我在 Swift 中为此做了一个 Xcode 8 源代码编辑器扩展。

        https://github.com/timaktimak/SwitchCaseGenerator

        希望对你有帮助!

        【讨论】:

          【解决方案6】:

          看到您的问题并决定构建一个 Xcode 插件来实现这一点。

          查看:https://github.com/stefanceriu/SCXcodeSwitchExpander

          【讨论】:

          • 我已经安装了 SCXcodeSwitchExpander,但在我的情况下它不起作用。我做了什么:安装了恶魔岛。安装了开关扩展器,多次重新启动 XCode。我做错了什么?
          【解决方案7】:

          虽然 Xcode 不会自动完成整个 switch 语句,但有一些技巧可以加快编写它们的速度。这就是我最近一直在做的事情:

          1. 启动 switch 自动完成,然后输入表达式
          2. 复制 case 块并粘贴足够多的次数以覆盖所有枚举常量(实际上,我只是粘贴了超出我需要的内容,稍后删除,而不是计数)
          3. 将光标移到第一个常量占位符之前
          4. 按 TAB,然后按常量的第一个字母,然后按 Enter 接受第一个自动完成建议
          5. 重复 TAB、字母、ENTER 其余部分。自动完成不会建议您已在 switch 中使用过的常量,因此列表会随着每次使用而缩小。

          当然,如果所有常量都以同一个字母开头,那真的很有帮助。在您的情况下,请考虑命名它们:

          typedef enum {
              dayOfWeekSunday,
              dayOfWeekMonday,
              dayOfWeekTuesday,
              dayOfWeekWednesday,
              dayOfWeekThursday,
              dayOfWeekFriday,
              dayOfWeekSaturday
          } enumDayOfWeek;
          

          【讨论】:

            【解决方案8】:

            不幸的是,开箱即用的 Xcode 无法做到这一点。提交错误报告并选择请求增强选项。

            https://bugreport.apple.com

            我最近实际上是自己做的,他们通过针对给定问题收到的重复数量来衡量错误/增强功能的严重性和重要性 - 因此是无法搜索跟踪器的原因之一。

            【讨论】:

            • 雷达#是什么?更容易复制。
            • Bug Reporter 不可搜索,是吗?尽管如此,这个票矿的 ID 被标记为重复 - 9663422
            • 不,但我将提交一份带有正文“9663422 重复”的错误报告。让我们所有人都更轻松。
            猜你喜欢
            • 2012-01-28
            • 1970-01-01
            • 1970-01-01
            • 2020-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多