假设你有一个枚举:
typedef enum {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
} DayOfWeek;
在编写switch语句时,Xcode正试图帮助使用switch语句片段:
然后:
很棒,但我需要列出所有枚举:
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;
}
不幸的是,必须手动完成:(是否有任何已知的片段填充所有案例?当然,我看到一些3岁的答案说这是不可能的,但也许从那时起发生了变化?有什么想法吗?
看到你的问题,并决定构建一个完全相同的Xcode插件。
不幸的是,Xcode开箱即用是不可能的。提交错误报告并选择请求增强选项。
实际上我最近自己做了这个,他们根据给定问题收到的重复数量来衡量错误/增强的严重性和重要性 - 因此无法搜索跟踪器的原因之一。
虽然Xcode不会自动完成整个switch语句,但有一些技巧可以加速编写它们。这是我最近一直在做的事情:
当然,如果所有常量都以相同的字母开头,那确实很有帮助。在您的情况下,请考虑命名它们:
menu > editor > refactor > expand switch cases
它不使用Xcode,但您可以使用任何脚本语言快速打磨已处理的代码段。把它作为插件放在你最喜欢的文本编辑器中(例如)。
我有一个文件夹,我放置这样的帮助器和typedef enum {
dayOfWeekSunday,
dayOfWeekMonday,
dayOfWeekTuesday,
dayOfWeekWednesday,
dayOfWeekThursday,
dayOfWeekFriday,
dayOfWeekSaturday
} enumDayOfWeek;
他们所以我可以随时使用这样:
Textmate
甚至更好地使用命令行粘贴板工具:
~/bin
chmod +x
事实证明
enumify.pl ~/tmp.txt
成
pbpaste | enumify.pl
嘿,我在Swift中为它做了一个Xcode 8源编辑器扩展。
#! /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;
}