Обязательно ли использовать метки пользовательских аргументов Swift 4 ВСЕГДА или просто для устранения неоднозначности функций? - PullRequest
0 голосов
/ 12 ноября 2018

Этот вопрос похож на Swift 4 пользовательских метки аргумента - обязательно? но более конкретно. Я сталкивался с этим вопросом при исследовании проблемы, вызванной переходом от var (не требующей параметра) к func (требующей параметра), но пропустил изменение всех ссылок. Я создал игровую площадку, которая противоречит заявлению, сделанному в последующем редактировании этого вопроса: «вопрос неправильный, поскольку пользовательские ярлыки обязательны» Мой вопрос: как правильно выразить то, что я наблюдал, как показано ниже:

class SomeTest {
    static func someParam(p1: String?) -> String? {
        return "hello \(p1 ?? "nothing")"
    }

    // Uncommenting the following causes error at let funny
    //    static func someParam(p2: String?) -> String? {
    //        return "hello \(p2 ?? "nothing")"
    //    }

    static func doIt() {
        let funny = someParam // ignoring the argument label is ok if there is no ambiguity

        funny("thing") // and can be used without

        someParam(p1: "thing2") // must have argument label
    }
}

SomeTest.doIt()

1 Ответ

0 голосов
/ 12 ноября 2018

Если у вас есть обе функции someParam (каждая с другим именем параметра), тогда строка:

let funny = someParam

больше не работает, так как неизвестно, на какую из двух someParam функций вы ссылаетесь. Это решается путем предоставления однозначного имени:

let funny = someParam(p1:) // or someParam(p2:)

Обратите внимание, что funny имеет тип (String?) -> String?. Обе функции someParam имеют один и тот же тип. Вот почему вы должны предоставить более подробную информацию для устранения неоднозначности. Имена параметров не меняют тип функции.

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

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

...