Подавление предупреждения компилятора 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))
}
Предупреждение для первой строки:
Параметр закрытия перед параметрами с аргументами по умолчанию не будет обрабатываться как замыкающее закрытие
Это не очень серьезная проблема, но я бы хотел, чтобы количество моих предупреждений компилятора было низким (ноль) в моих проектах. Есть ли способ удалить это предупреждение?
Ответы
Ответ 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>
- даже с правильным синтаксисом в 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
Похоже на очень серьезное предупреждение для меня, что вы определенно не должны игнорировать. Кажется, что то, что вы считаете вызовом функции с параметром закрытия, на самом деле является вызовом функции без параметра закрытия, за которым следует замыкание.
Вы легко избегаете предупреждения и исправляете проблему, помещая замыкание в список параметров или назначая его переменной перед вызовом и передавая эту переменную.