将属性文本设置为UIButton

时间:2014-06-10 18:09:29

标签: uibutton swift nsattributedstring

我正在尝试将属性字符串设置为按钮。

swift上这个函数的定义是这个

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

所以我想我必须输入它像

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

但正确的是

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

为什么有必要提出forState:而不是title?我不明白。

顺便说一下func定义中下划线的含义是什么?

1 个答案:

答案 0 :(得分:3)

因为这是方法参数在swift中的工作方式。我强调方法,因为这不适用于裸函数,即类范围外的func定义。

默认情况下,第一个参数没有显式名称,而其他名称则是强制性的。

来自official guide

  

Swift中的方法与Objective-C中的方法非常相似。与在Objective-C中一样,Swift中方法的名称通常是指方法的第一个参数,它使用一个介词,例如with,for或by,如前面Counter类示例中的incrementBy方法所示。使用介词使得该方法在被调用时可以被读作句子。 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)