Подтвердить что ты не робот

Подавление предупреждения компилятора Swift

Я использую проворную структуру утверждения для модульного тестирования в Swift (Xcode 6.3 beta). Он отлично работает, но компилятор дает предупреждение для одной из строк в исходном коде Nimble:

public func expect<T>(expression: () -> T?, file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> {
    return Expectation(
        expression: Expression(
            expression: expression,
            location: SourceLocation(file: file, line: line),
            isClosure: true))
}

Предупреждение для первой строки:

Параметр закрытия перед параметрами с аргументами по умолчанию не будет обрабатываться как замыкающее закрытие

Это не очень серьезная проблема, но я бы хотел, чтобы количество моих предупреждений компилятора было низким (ноль) в моих проектах. Есть ли способ удалить это предупреждение?

4b9b3361

Ответ 1

Вы можете избежать предупреждения, если будет выглядеть подпись метода:

public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> 

добавлена ​​дополнительная скобка вокруг первого аргумента, протестированная с Swift 2.0 и Xcode 7.1

Другим способом его устранения является наличие всех атрибутов со значением по умолчанию перед атрибутом закрытия, поскольку закрытие закрытия является довольно удобной вещью для

Ответ 2

Ответ на

@Julian Król неверен по двум причинам:

  • фрагмент кода демонстрирует неправильный синтаксис, правильным будет:

public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T>

  1. даже с правильным синтаксисом в Xcode 7.1 он не устраняет проблему, потому что вы не можете вызывать эти методы с закрытием закрытия - это даст вам ошибку компиляции, например Missing argument for parameter #1 in call.

С предоставленным кодом вы избавитесь от предупреждения, но не сможет использовать закрытие при закрытии при вызове этой функции.

Он исправляет предупреждение, потому что в Swift кортеж с одним ребенком взаимозаменяем только с одной переменной. И даже ((((value)))) тот же, что и value. Также похоже, что компилятор не распознает кортеж с закрывающим потомком как автономное закрытие в списке аргументов функций.

Ответ 3

Для всех будущих читателей этой темы: ответ будет только для случая, когда у вас закрытие закрытия. AFAIK, вы не можете подавить предупреждения Swift, как вы делали бы в Objective-C (отключить предупреждения для определенных строк), возможно, когда источник компилятора Swift будет открытым исходным кодом, будут некоторые действительные решения, и этот ответ будет обновлено. До тех пор вы можете проверить эти ответы (а не Свифт):

В Xcode, как подавлять все предупреждения в определенных исходных файлах?

Есть ли способ подавить предупреждения в Xcode?

Если вы можете изменить подпись ожидания, то поставьте выражение параметра в конец, например:

public func expect<T>(file: String = __FILE__, line: UInt = __LINE__, expression: () -> T?) -> Expectation<T>

Честно говоря, плохой дизайн имеет параметр закрытия в качестве первого параметра.

Ответ 4

Похоже на очень серьезное предупреждение для меня, что вы определенно не должны игнорировать. Кажется, что то, что вы считаете вызовом функции с параметром закрытия, на самом деле является вызовом функции без параметра закрытия, за которым следует замыкание.

Вы легко избегаете предупреждения и исправляете проблему, помещая замыкание в список параметров или назначая его переменной перед вызовом и передавая эту переменную.