Как автозаполнение перечислимого коммутатора с помощью Xcode?

Скажем, у вас есть перечисление:

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

при написании оператора switch Xcode пытается помочь с помощью фрагмента инструкции switch:

enter image description here

а затем:

enter image description here

отлично, но мне нужно перечислить все перечисления:

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-х лет, что это невозможно, но с того времени что-то изменилось? Любые идеи?

Ответы

Ответ 2

Короткий ответ:

Используйте Editor > Refactor > Add Missing Switch Cases

Xcode screenshot

Удобный способ:

  1. Откройте Preferences, нажав [command] + [,] в Xcode.
  2. Перейдите на вкладку " Key Bindings " и установите ярлык для команды " Refactor > Add Missing Switch Cases. xcode preferences screenshot
  3. Введите ярлык в редакторе. Убедитесь, что курсор находится на switch букв. xcode gif

Ответ 3

К сожалению, это невозможно с Xcode из коробки. Распечатайте отчет об ошибке и выберите опцию расширения.

https://bugreport.apple.com

Я действительно сделал это сам в последнее время, и они оценивают степень и важность ошибок/улучшений по количеству дубликатов, которые они получают для данной проблемы, поэтому одна из причин невозможности поиска трекера.

Ответ 4

в Xcode 10 сделайте следующее

  1. добавьте шаблон switch...case и установите тип enum вместо self чтобы xcode понимал, что он должен автозаполнить

  1. переместите курсор внутрь switch слов и перейдите в menu > editor > refactor > expand switch cases регистр menu > editor > refactor > expand switch cases

Это то, что вы получите в результате

Ответ 5

В то время как Xcode не будет автозаполнять весь оператор switch, есть уловки для ускорения их написания. Это то, что я делал в последнее время:

  • Запустите автозаполнение коммутатора и введите выражение
  • Скопируйте блок case и вставьте его достаточно времени, чтобы охватить все константы enum (на самом деле, я просто вставляю больше, чем мне нужно, и удаляю позже, а не подсчитываю)
  • Переместите курсор до первого константного заполнителя
  • Нажмите TAB, затем первую букву константы, затем Enter, чтобы принять первое предложение автозаполнения.
  • Повторите TAB, букву, ENTER для остальных. Autocomplete не будет предлагать константы, которые вы уже использовали в коммутаторе, поэтому список сужается при каждом использовании.

Конечно, это действительно помогает, если все константы начинаются с одной и той же буквы. В вашем случае рассмотрите их именование:

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

Ответ 6

Он не использует XCode, но вы можете очень быстро отрыть обработанные фрагменты с любым языком сценариев. Добавьте его как плагин в ваш любимый текстовый редактор (например, Textmate).

У меня есть папка ~/bin которую я chmod +x таких помощников и 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;
}

Ответ 8

Просто нажмите кнопку "Исправить", и появятся кейсы: enter image description here