Что означает знак «#» на быстром языке
7711 просмотра
5 ответа
Я видел такой код:
func hello(name: String, #helloMessage: String) -> String {
return "\(helloMessage), \(name)."
}
Мой вопрос: что #
означает знак перед именем параметра? Значит ли это, что параметр должен быть указан при вызове функции?
Более того, кто-нибудь может показать мне разницу с функцией без этой #
отметки? Примеры кода более чем приветствуются.
Ответы (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:495 плюса
Это изменилось в 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.
Автор: Chetan Bhalara Размещён: 24.06.2014 09:050 плюса
В предыдущих версиях Swift все, что писал @ovejka, было правдой. В Swift 2.0 и выше он выглядит как #
неиспользуемый (в этом или аналогичном контексте, не считая #available
)
-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Вопросы из категории :
- swift Как я могу программным образом определить, работает ли мое приложение в симуляторе iphone?
- swift iOS: Convert UTC NSDate to local Timezone
- swift Как установить цель и действие для UIBarButtonItem во время выполнения
- swift Жирный и не жирный текст в одном UILabel?
- swift Найти касательную точки на кубической кривой безье
- swift Как я могу рассчитать разницу между двумя датами?
- swift How to get text / String from nth line of UILabel?
- swift Можно ли программно прокрутить до нужной строки в UIPickerView?
- swift Отключение клавиатуры в UIScrollView
- swift Как контролировать межстрочный интервал в UILabel
- swift Формат UILabel с маркерами?
- swift Как я могу создавать локальные уведомления в iOS?
- swift UILabel с текстом двух разных цветов
- swift Многострочная метка iOS в Интерфейсном конструкторе
- swift Неизвестный пароль UITextField
- swift Delete all keys from a NSUserDefaults dictionary iOS
- swift Скопируйте CGContext в другой CGContext
- swift Как ждать в Objective-C и Swift
- swift Событие изменения текста UITextField
- swift Получить системный том iOS