Каково значение знака «#» на языке быстрого доступа

17

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

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

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

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

    
задан Julian Król 24.06.2014 в 10:47
источник

5 ответов

38

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

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

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

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's clear.

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

func someFunction(#parameterName: Int) { parameterName }
// It's 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. «Язык быстрого программирования». iBooks. Ссылка

    
ответ дан ovejka 24.06.2014 в 10:49
источник
5

Это изменилось в 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")
    
ответ дан Moritz 26.10.2015 в 11:48
источник
1

**

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

**

Если вы хотите предоставить имя внешнего параметра для параметра функции, а имя локального параметра уже является подходящим именем для использования, вам не нужно дважды вводить одно и то же имя для этого параметра. Вместо этого напишите имя один раз и префикс имени с символом хеша (#). Это говорит 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. «Язык быстрого программирования». iBooks.

Ссылка

    
ответ дан Chetan Bhalara 24.06.2014 в 11:05
источник
0

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

    
ответ дан Julian Król 25.10.2015 в 22:35
источник
-3

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

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

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) .

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

ответ дан Chris 14.08.2015 в 15:47
источник