Swift中的可选参数标识符

时间:2014-09-18 14:18:10

标签: ios swift

我正在学习iOS和Swift开发,并对函数参数标识符有疑问。这是UIButton.setText的签名,因为它在Xcode建议提前输入时出现:

// Xcode type-ahead signature:
sender.setTitle(title: String?, forState: UIControlState)

当我复制并粘贴它时会插入更多信息,例如:

// Actual signature from documentation:
sender.setTitle(<#title: String?#>, forState: <#UIControlState#>)

我的用法是这样的:

sender.setTitle("Hello World", forState: UIControlState.Normal)

如您所见, forState参数标识符是必需的,但title标识符不是必需的。如何从Xcode提前输入方法签名建议中确定这一点? ?中的title: String?是否将标识符表示为可选标识符?如果没有,那会怎么做?

2 个答案:

答案 0 :(得分:4)

  

... forState参数标识符是必需的,但title标识符不是。如何从Xcode的提前输入方法签名建议中确定这一点?

这是模板在屏幕上的样子:

setTitle template

请注意,第一个占位符包含title: String?,而第二个占位符仅包含UIControlState(并且包含forTitle:)。这就是你知道第一个参数不需要关键字的方法,但第二个参数确实如此。这也使您的标签键自动选择要替换的正确数量的文本。 (您也可以使用导航&gt;跳转到下一个占位符 control / ,如果 tab 不起作用。)

您的粘贴副本如下所示:

sender.setTitle(<#title: String?#>, forState: <#UIControlState#>)

<# ... #>是Xcode代表占位符的方式。请注意,第一个参数(包括关键字)位于<# ... #>内,但第二个占位符排除了关键字forState:,仅包含UIControlState类型。

您可以使用此语法在自己的自定义代码段中创建占位符。您只需在代码段中输入<##>即可。只要您完成输入#>,Xcode就会将带注释的文本转换为占位符。示范:

snippet demonstration

?之后的String表示可选字符串。它是Optional<String>的句法糖。您可以阅读The Swift Programming Language中标题为“选项”的部分,详细了解Optional

答案 1 :(得分:1)

有几种方法可以说明:

  1. 方法中参数标签的Swift规则是在需要调用和休息时省略第一个参数标签。这模仿了Objective-C中的约定,其中方法名称和第一个参数标签一起运行 - setTitle已经引用了一个标题,所以如果它读取setTitle(title:...则听起来很有趣。就像在ObjC中一样,Swift方法调用应该像句子一样。

  2. 当您在自动完成中选择方法时,Xcode会为您要替换的文本留下占位符和您自己的代码。那些在Xcode中显示为蓝色椭圆形,但它们实际上只是由<# #>分隔的文本,您可以在将其粘贴到问题中时看到。

    作为占位符的自动填充文本部分是您需要填写以完成方法调用的内容;不在占位符中的部分是调用该方法所需的语法。在您的示例中,title:位于第一个参数的占位符内,因此您在调用方法时不会编写它,并且forState:不在占位符中,因此您在调用时会写入它方法。