将富文本设置为UIButton的文本

4

我希望您能为按钮设置一个属性字符串。

在 Swift 中,此函数的定义如下:

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

所以我认为我需要像这样输入它

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

但正确的写法是

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

为什么需要放置 forState: 而不是 title?我不明白。

顺便问一下,函数定义中下划线的含义是什么?

1个回答

3
因为这是Swift中方法参数的工作方式。我强调“方法”这个词,因为对于裸函数(即类范围之外的func定义)不适用。
默认情况下,第一个参数没有明确的名称,而其他参数则必须有名称。
来自官方指南 在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)

那么告诉我为什么 var attrString = NSAttributedString("Hello World", attributes:dictAttributes) 不起作用,而 var attrString = NSAttributedString(string: "Hello World", attributes:dictAttributes) 起作用呢? - Duck
因为那不是一个方法。它是一个函数,并且具有不同的默认规则。 - Gabriele Petronella
这个参数没有外部参数名。 - Duck
1
我很确定你的例子不起作用,因为它是一个类初始化器,其遵循不同于方法的规则。此外,“外部参数”就是这个意思,定义中没有定义外部参数。请阅读语言定义,因为那是一个精确的术语。 - Kendall Helmstetter Gelner
1
@RubberDuck 外部参数名是您用于命名传递给方法的参数的名称,例如 forStateforState 是该函数的本地参数名和外部参数名。您可以在官方指南中找到有关此的大量信息。 - Gabriele Petronella
啊啊啊啊啊啊啊啊啊啊啊啊啊啊!现在我们说的就是这个!答案完美无缺!谢谢。只要SO允许,我会尽快接受你的答案。 - Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接