Нарушение вложенности. Типы должны быть вложены не более чем на 1 уровень.

struct Email {
    struct Constraints {
        static let top = 20.asConstraint()
    }

    static let placeholder = "login_email"
}

введите описание изображения здесь

Как решить эту проблему?


person Bartłomiej Semańczyk    schedule 16.10.2017    source источник
comment
это предупреждение о быстром ворсе? это не похоже на предупреждение xcode, а на ошибку lint   -  person Lu_    schedule 16.10.2017
comment
Похоже, это создано swiftlint. Итак, просто отредактируйте файл правил   -  person Alladinian    schedule 16.10.2017
comment
Да, это предупреждение о быстром линте;) но мне нужно сделать код получше, а не исключать правило из линта;)   -  person Bartłomiej Semańczyk    schedule 16.10.2017
comment
@BartłomiejSemańczyk О, понятно. Правда в том, что это не очень ясно из вашего вопроса. Не могли бы вы дать нам краткое определение «лучшего кода» в этом контексте?   -  person Alladinian    schedule 16.10.2017
comment
не все из нас используют swiftlint, почему бы не сообщить нам, откуда вы получили предупреждение?   -  person Lu_    schedule 16.10.2017
comment
Какую версию свифтлинта вы используете? Какая версия Свифта? Я знаю, что была ошибка, из-за которой случаи enum обрабатывались как объявление типа (например, enum внутри struct выдавало это предупреждение), но это было исправлено. См. проблему 190. В приведенном выше примере кажется, что аналогично статическое свойство top обрабатывается как объявление типа, нарушая ограничение глубины вложенности swiftlint:s, равное 1.   -  person dfrib    schedule 16.10.2017
comment
@Alladinian да, что сделать, чтобы это предупреждение исчезло?   -  person Bartłomiej Semańczyk    schedule 16.10.2017
comment
Также обратите внимание, что это конкретное предупреждение о swiftlint обсуждалось ранее на SO, отметив, что для этого, по-видимому, нет технической причины и что, например, стандартные библиотеки Swift используют сами глубоко вложенные типы, и что руководство Swift API не рекомендует против такой практики. Поэтому вы можете просто отключить это правило swiftlint (// swiftlint:disable nesting).   -  person dfrib    schedule 16.10.2017
comment
@dfri Я думаю, ты прав. мне удобно ;)   -  person Bartłomiej Semańczyk    schedule 16.10.2017


Ответы (3)


Это конкретное правило SwiftLint, nesting уже обсуждалось в следующих вопросах и ответах:

С некоторым консенсусом в отношении того, что это правило не основано на технической причине, а, скорее, кажется основанным на мнении правилом «наилучшей практики», которое заметно не соблюдается, например. стандартными библиотеками Swift (которые часто используют вложенный тип). Более того, руководство по языку Swift, в частности Раздел о вложенных типах, не содержит предупреждений/рекомендаций против вложения типов глубже, чем глубина 1.

... Типы могут быть вложены на любом количестве уровней.

Один из мотивов для этого (правило, основанное на мнении) можно найти в SwiftLint issue 1450:

jpsim:

Правило вложенности существует по двум причинам:

  • чтобы избежать чрезмерно вложенных типов в API
  • чтобы избежать чрезмерных отступов (также известных как пирамида судьбы)

...

Основываясь на вышеизложенном, если вы не обнаружите, что ваш код превращается в нечитаемую пирамиду дум-спагетти (чего я не думаю в вашем примере), вы можете просто рассмотреть возможность отключения правило nesting:

// swiftlint:disable nesting
person dfrib    schedule 16.10.2017

Вы можете создать другую структуру:

struct Email {
    let constraints = EmailConstraints()
    let placeholder = "login_email"
}

struct EmailConstraints {
    let top = 20.asConstraint()
}

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

person KlimczakM    schedule 16.10.2017
comment
Это не проблема версии Swift, Swift 2 (и, возможно, 1.2) поддерживает вложенные структуры. - person Martin R; 16.10.2017
comment
@MartinR Ты прав. Начиная с Swift 3.1 вы можете использовать вложенные типы внутри дженериков. - person KlimczakM; 16.10.2017

попробуйте добавить это правило в свой .swiftlint.yml

nesting:
  type_level:
    warning: 3 --> this means the warning appears if you nest 3 level deep instead of 1
    error: 6
  statement_level:
    warning: 5
    error: 10

Ссылка: https://realm.github.io/SwiftLint/nesting.html

person Vina    schedule 05.02.2020