Установить атрибутированный текст для UIButton

Я пытаюсь установить атрибутивную строку для кнопки.

Определение этой функции на Swift таково:

func setAttributedTitle(_ title: NSAttributedString!,
               forState state: UIControlState)

поэтому я подумал, что мне придется напечатать это как

myButton.setAttributedTitle(title:attrString, forState: UIControlState.Normal)

но правильно

myButton.setAttributedTitle(attrString, forState: UIControlState.Normal)

почему надо ставить forState: а не title? Я не понимаю.

И, кстати, что означает это подчеркивание в определении функции?


person Duck    schedule 10.06.2014    source источник


Ответы (1)


Потому что так работают параметры methods в swift. Я подчеркиваю методы, потому что это не относится к голым функциям, т. е. func определениям вне области действия класса.

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

Из официальное руководство

Методы в Swift очень похожи на свои аналоги в Objective-C. Как и в Objective-C, имя метода в Swift обычно относится к первому параметру метода с использованием предлогов, таких как with, for или by, как показано в методе incrementBy из предыдущего примера класса Counter. Использование предлога позволяет читать метод как предложение при его вызове. Swift упрощает запись этого установленного соглашения об именах методов, используя другой подход по умолчанию для параметров метода, чем тот, который используется для параметров функции.

В частности, Swift по умолчанию присваивает первому имени параметра в методе имя локального параметра, а второму и последующим именам параметров по умолчанию присваивает как локальные, так и внешние имена параметров. Это соглашение соответствует обычному именованию и вызову соглашение, с которым вы познакомитесь по написанию методов Objective-C, и обеспечивает выразительные вызовы методов без необходимости уточнять имена параметров.

Подчеркивание означает: этот параметр не имеет имени внешнего параметра. Для первых аргументов методов это избыточно, но вы можете использовать его, например, для изменения поведения по умолчанию, описанного выше.

Например

class Foo {
    func bar(a: String, b: Int) {}
    func baz(a: String, _ b: Int) {}
}

приведет к следующему правильному использованию вызовов методов:

var f = Foo()
f.bar("hello", b: 1)
f.baz("hello", 1)

Добавление _ приводит к тому, что b становится только локальным именем, поэтому вы не можете

f.baz("hello", b: 1)
person Gabriele Petronella    schedule 10.06.2014
comment
Тогда скажи мне, почему var attrString = NSAttributedString("Hello World", attributes:dictAttributes) не работает, а var attrString = NSAttributedString(string: "Hello World", attributes:dictAttributes) работает. - person Duck; 10.06.2014
comment
потому что это не метод. Это функция, и у нее другие правила по умолчанию. - person Gabriele Petronella; 10.06.2014
comment
ах... можешь перевести эту фразу на английский? this parameter has no external parameter name - person Duck; 10.06.2014
comment
Почти уверен, что ваш пример не работает, потому что это инициализатор класса, который следует правилам, отличным от методов. Также внешний параметр означает только то, что в определении не определен внешний параметр. Прочтите определение языка, так как это точный термин. - person Kendall Helmstetter Gelner; 10.06.2014
comment
@RubberDuck имя внешнего параметра — это имя, которое вы используете для именования аргумента, который вы передаете методу, например forState. forState — это имя как локального, так и внешнего параметра функции. Вы можете найти много информации об этом в официальном руководстве. - person Gabriele Petronella; 10.06.2014
comment
ааааааааааааааааааааааааааааааааа!!!!!!!!!!! Теперь поговорим!!!! Ответ идеален сейчас! Спасибо. Я приму ваш ответ, как только SO позволит мне. - person Duck; 10.06.2014