2015-11-10 3 views
1

Может кто-нибудь объяснить этот кусок синтаксиса Swift мне пожалуйста:Может ли кто-нибудь объяснить синтаксис Swift?

func someFunc(label label: String, image: UIImage){} 

Мне интересно, что означает, что первый параметр label? Почему у него нет типа? Почему нет разделителя запятой?

+3

Это имя внешнего параметра, оно используется для более четкого определения параметров. Когда вы вызовете эту функцию, вам нужно будет указать имя первого параметра. например 'someFunc (label: myLabel, image: myImage)' – awph

+2

@awph Спасибо за ответ! Я прав, если бы функция была бы похожа на 'func someFunc (label: String, image: UIImage) {}', тогда вызов будет похож на 'someFunc (myLabel, image: myImage)'? – pulp

+2

Кстати, вы можете использовать его и по другим параметрам, чтобы быть более четкими. например 'func someFunc (с меткойMyLabel: String, andImage image: UIImage) {}', и вызов будет 'someFunc (withMyLabel: myLabel, andImage: myImage)' – awph

ответ

3

Когда вы даете два имени переменной, первая используется вызывающими функциями, а вторая используется внутри вашей функции.

См. this documentation, прокрутите вниз до Указание имен внешних параметров. Вот пример из этого раздела.


Вот версия SayHello (_ :) функция, которая принимает имена двух людей и возвращает приветствие для обоих из них:

func sayHello(to person: String, and anotherPerson: String) -> String { 
    return "Hello \(person) and \(anotherPerson)!" 
} 
print(sayHello(to: "Bill", and: "Ted")) 
// prints "Hello Bill and Ted!" 

Указав имена внешних параметров для обоих параметров, как первый, так и второй аргументы функции sayHello (to: and :) должны быть помечены, когда вы его вызываете.

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

2

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

func someFunc(label label: String)

Внешнее имя всегда левая, а правая - локальная. Если у вас есть более одного аргумента, то, если вы хотите иметь разные внутренние с внешним именем вы можете указать его следующим образом:

func someFunc(label label: String,externalName image: UIImage){}

Внутреннее имя аргумента используется внутри функции и внешнее имя будет правильно после того, как вы называете function.This будет результат, если вы звоните someFunc:

someFunc(label: ..., externalName:)

вы можете полностью удалить имя из второго аргумента, добавив _ вместо его имени. Я предлагаю вам хорошо посмотреть здесь, чтобы получить хорошее представление о функциях в быстром. Functions in Swift

+1

Да, я думаю, мне нужно было погрузиться глубже в документы, спасибо! – pulp

+1

Это действительно поможет вам понять некоторые важные вещи, которые вы будете использовать чаще всего в быстром! Имейте в виду, что Swift сильно меняется, поэтому, возможно, вам придется время от времени смотреть в документацию на всякий случай! – Korpel

3

Другие ответили на вопрос о синтаксисе внешних имен для параметров в Swift 2, поэтому я не буду повторять это здесь.

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

update(label label: String, image: UIImage) { ... } 

Тогда вы назвали бы это как

update(label: "foo", image: barImage) 

Но Swift 2, это как правило, рекомендуется включать идентифицирующую информацию в самом названии метода, например,

updateLabel(label: String, image: UIImage) { ... } 

, и тогда вы бы назвали это как

updateLabel("foo", image: barImage) 

Ключевое наблюдение в названиях методов является то, что последнее существительное в имени метода часто ссылается на первый параметр (и, таким образом, почему мы вообще не» t введите имя внешнего параметра для первого параметра). Но если это последнее существительное в имени метода не ссылается на первый параметр, вы можете указать внешнее имя для этого параметра.


Стоит отметить, что приведенное выше описание относится только к Swift до версии Swift 3, где они определили именование параметров (например, если имя первого параметра включается в имя метода, и, как правило, нет метка на первом параметре), чтобы отразить API Objective-C, распространенный в Cocoa в то время. В Swift 3 это соглашение изменилось.

В Swift 3, они явно свидетельствуют о том, что имя метода не включать имя первого параметра, так что вы бы определить выше, чтобы быть:

func update(label: String, image: UIImage) { ... } 

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

update(label: "Foo", image: someImage) 

Если вам нужно картина Swift 2 для подавления первого (или какой-либо параметр), в Swift 3 вы можете сделать это с _:

updateLabel(_ label: "Foo", image: someImage) 

Но, в то время как вы можете подавить параметр (с _ в Swift 3), это как правило, не посоветовал сделать это, если нет других убедительных оснований для этого.

+1

О, ничего себе.Благодарим вас за ответ, теперь понятно, почему разработчики Apple называют свои методы без указания первого параметра! Очень глубокое наблюдение! – pulp

Смежные вопросы