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

В чем смысл метки "#" на быстром языке?

Я видел такой код:

func hello(name: String, #helloMessage: String) -> String { 
    return "\(helloMessage), \(name)." 
} 

Мой вопрос в том, что означает # знак перед именем параметра? Значит ли это, что параметр должен быть указан при вызове функции?

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

4b9b3361

Ответ 1

Обновление (Swift 3. *...)

поведение по умолчанию для первой сигнатуры параметров было резко изменено. Чтобы понять, как работают метки меток (например, "внешние параметры" ) и имена параметров (например, "локальные параметры" ), прочитайте главу "Ярлыки аргументов функции и имена параметров" из книги "Яблоки Свифт".

Некоторые примеры:

func someFunction(parameterName: Int) { parameterName }
someFunction(parameterName: 5) // argument label not specified

func someFunction(argumentLabel parameterName: Int) { parameterName }
someFunction(argumentLabel: 5) // argument label specified

func someFunction(_ parameterName: Int) { parameterName }
someFunction(5) // argument label omitted

Нет никакой разницы в этом поведении между методами и функциями.


Обновление (Swift 2.. *)

Функция, описанная ниже, была устаревшей, нужно дважды написать имя параметра, чтобы получить то же поведение, что и с символом хеша.


Обновление (примеры)

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

func someFunction(parameterName: Int) { parameterName }
someFunction(5) // What is the meaning of "5"? 

func someFunction(externalParameterName parameterName: Int) { parameterName }
someFunction(externalParameterName: 5) // Now it clear.

Но если внешние и локальные имена одинаковы, вы просто пишете символ хэша перед именем параметра.

func someFunction(#parameterName: Int) { parameterName }
// It actually like:
// func someFunction(parameterName parameterName: Int) { parameterName }
someFunction(parameterName: 5)

Для методов: по умолчанию имя первого параметра является только локальным (например, по функциям), но второе и последующие имена параметров являются как локальными, так и внешними (например, когда вы пишете хэш-символ перед именем параметра, это # ​​неявно присутствует)

class SomeClass {
    func someMethodWith(firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(5, andSecondParameter: 10)

Вы также можете использовать # (или добавить явное внешнее имя) для первого параметра метода, но оно не будет соответствовать Objective-C -строчному вызову.

class SomeClass {
    func someMethodWith(#firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(firstParameter: 5, andSecondParameter: 10)

Оригинальный ответ

Если вы хотите указать имя внешнего параметра для функции параметр, а имя локального параметра уже является соответствующим именем для использования вам не нужно писать одно и то же имя дважды для этого параметр. Вместо этого напишите имя один раз и префикс имени с помощью хэш-символ (#). Это говорит, что Swift использует это имя как локальное имя параметра и имя внешнего параметра.

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itunes.apple.com/ru/book/swift-programming-language/id881256329?l=en&mt=11

Ответ 2

Это изменилось в Swift 2:

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


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

func sayHiFrom(sender: String, to: String) {
    print("Hi from \(sender) to \(to)!")
}

sayHiFrom("Jules", to: "Jim")

Указание имени внутреннего параметра

На этот раз второй параметр имеет другое имя для использования внутри метода без изменения внешнего имени. Когда есть два имени для параметра, первый из них является внешним, а второй - внутренним:

func sayHiFrom(sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHiFrom("Jane", to: "John")

Принуждение внешнего имени параметра

Вы можете заставить первый параметр иметь внешнее имя:

func sayHi(from sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi(from: "Joe", to: "Jack")

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

Принуждение внешних имен параметров

Вы также можете удалить имя параметра для других параметров, указав перед ними _ (подчеркивание):

func sayHi(sender: String, _ receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi("Janice", "James")

Ответ 3

**

Сокращенные имена внешних параметров

**

Если вы хотите предоставить имя внешнего параметра для параметра функции, а имя локального параметра уже является подходящим именем для использования, вам не нужно дважды вводить одно и то же имя для этого параметра. Вместо этого напишите имя один раз и префикс имени с символом хеша (#). Это говорит Swift использовать это имя как имя локального параметра, так и имя внешнего параметра.

В этом примере определяется функция, называемая containsCharacter, которая определяет имена внешних параметров для обоих параметров, помещая символ хэша перед их локальными именами параметров:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

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

let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v"

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги.

https://itun.es/in/jEUH0.l

Ответ 4

С предыдущими версиями Swift все, что было опубликовано в @ovejka, было правдой. В Swift 2.0 и выше он выглядит как # не используется (в этом или подобном контексте, не считая #available)

Ответ 5

Я согласен. Это запутанно, но я надеюсь, что это поможет разобраться.

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

func x(a:Int, b:Int, c:Int) {some code}
x(10,20,30) or x(a:10, b:20, c:30) //Still have to be in order!

... , но, если вы добавили #, первый вариант не разрешен, т.е. x(10,20,30), так как Swift теперь принудительно использует метки. Вы можете использовать x(a:10, b:20, c:30).

Зачем это было? Ясность. Делает код более читаемым.