Xcode 10.2 Swift Error: типы функций не могут быть представлены в Objective-C, если их параметры и возвраты не могут быть

Сегодня я обновил Xcode до 10.2 и получил следующие ошибки:

Метод не может быть помечен @objc, потому что тип параметра 2 не может быть представлен в Objective-C.

Типы функций не могут быть представлены в Objective-C, если их параметры и возвращаемые значения не могут быть. Я не понимаю, почему

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

@objc public func myFunction(inputString: String, handler:@escaping ((success: Bool, outPut: NSArray)) -> Void) {
    // do stuff
}

person Tibidabo    schedule 27.03.2019    source источник
comment
Является ли это функцией-членом класса? — Мой Xcode 10.2 жалуется «Не удается создать одноэлементный кортеж с меткой элемента» с помощью Fix-it » Замените 'outPut:' на ''”   -  person Martin R    schedule 27.03.2019
comment
@MartinR Я удалил метку элемента, и это решило проблему, см. ответ от Мэтта   -  person Tibidabo    schedule 27.03.2019
comment
Я знаю, что это делает. Но если я не могу воспроизвести точное сообщение об ошибке, как сообщалось, мне интересно, был ли опубликован точный код :)   -  person Martin R    schedule 27.03.2019
comment
@MartinR Извините, вы правы. Я упростил его... В кортеже должно быть более одного элемента. должно быть: func myFunction(inputString: String, handler:@escaping ((success: Bool, outPut: NSArray)) -> Void) { // делаем что-то }   -  person Tibidabo    schedule 27.03.2019
comment
Я рад, что ваша проблема решена. Но, пожалуйста, обновите свой вопрос, указав фактический код, который выдает это сообщение об ошибке - это повышает вероятность того, что другие люди с той же проблемой найдут этот вопрос и ответ и решение. См. также stackoverflow.com/help/on-topic: "Вопросы, требующие помощи по отладке (почему это не работающий код?) должен включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей».   -  person Martin R    schedule 27.03.2019
comment
@MartinR Я обновил вопрос, указав правильный код. Спасибо   -  person Tibidabo    schedule 27.03.2019
comment
Теперь становится интересно: в вашем аргументе закрытия есть дополнительная пара круглых скобок, по-видимому, Swift 4 игнорирует это, а Swift 5 - нет. Если вы удалите эту дополнительную пару: handler:@escaping (success: Bool, outPut: NSArray) -> Void, вы получите четкое сообщение об ошибке «Типы функций не могут иметь меток аргументов; используйте '_' перед 'outPut'” уже в Swift 4/Xcode 10.1. — Так что изменились не запрещенные имена внешних параметров (они уже запрещены в Swift 4), а то, как компилятор обрабатывает лишнюю пару скобок.   -  person Martin R    schedule 27.03.2019


Ответы (1)


Удалите фразу outPut:. Это всегда было незаконно; Swift 5 просто подтягивается наконец.

So:

@objc public func myFunction(inputString: String, handler:@escaping (NSArray) -> Void) {
person matt    schedule 27.03.2019
comment
Вы также не должны использовать NSArray, но это другой вопрос. - person matt; 27.03.2019
comment
Спасибо, Мэтт. Это помогло. Есть ли способ назначить фразы переменным, которые не являются недопустимыми? - person Tibidabo; 27.03.2019
comment
@Tibidabo: вы можете определить параметр как handler: @escaping (_ output: NSArray) -> Void. Это также позволяет документировать параметр, см. stackoverflow.com/a/38669796/1187415. - person Martin R; 27.03.2019