Что означает знак «#» на быстром языке

swift

7711 просмотра

5 ответа

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

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

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

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

Автор: Julian Król Источник Размещён: 12.11.2019 09:26

Ответы (5)


41 плюса

Решение

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

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

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

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. «Язык программирования Swift». IBooks. https://itunes.apple.com/ru/book/swift-programming-language/id881256329?l=en&mt=11

Автор: ovejka Размещён: 24.06.2014 08: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")
Автор: ayaio Размещён: 26.10.2015 10: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. «Язык программирования Swift». IBooks.

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

Автор: Chetan Bhalara Размещён: 24.06.2014 09:05

0 плюса

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

Автор: Julian Król Размещён: 25.10.2015 09:35

-1 плюса

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

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

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 01:47
Вопросы из категории :
32x32