2016-09-29 69 views
2

我是苹果Swift的新手。我试图根据此tutorial构建一个演示应用程序。我发现该应用程序无法正常工作。一些试验和失败后,我发现,如果我改变的代码行:在什么情况下,我应该使用_作为swift中的参数

func textFieldDidEndEditing(textField: UITextField) { 

func textFieldDidEndEditing(_ textField: UITextField) { 

我能够正常运行的代码。

我想知道通过添加_作为参数之一会发生什么。这两种方法都不会导致编译错误。但第一个确实会给出如下警告:

ViewController.swift:35:10: Instance method 'textFieldDidEndEditing(textField:)' 
nearly matches optional requirement 'textFieldDidEndEditing' of protocol 'UITextFieldDelegate' 

由于第一个是由apple教程给出的,我不确定它是否是一个错误。有人可以澄清我的疑惑吗?

+0

我使用的是最新版本的Xcode – user3588276

+0

可以有正确的答案在这里:?什么是代表在斯威夫特引用_下划线( http://stackoverflow.com/questions/24437388/whats-the-underscore-representative-of-in-swift-references) –

回答

2

我想你使用的是Swift 3.0。您所遵循的教程可能是Swift 2.2或Swift 2.3版本。这只不过是从我观察到的语法变化。即使我昨天遇到这种情况时,我已经更新到的Xcode 8.0

0

,如果你想在没有外部名称的多个参数,则必须使用” _”下划线字符作为它的外部名称:

1

从斯威夫特3第一个参数标签也是初始化器的标准。

夫特3演进

首先参数声明将匹配第二和后面的参数的现有行为。所有参数,无论位置如何,均会表现均匀。这将在整个Swift编程语言中创建一个简单,一致的参数声明方法,并使方法和函数声明与已经使用此标准的初始化程序同步。

例如

func foo(x: Int, y: Int) 

将宣布foo(x:y:)和不foo(_:,y:)

现有的外部标签覆盖将继续适用于第一个参数。您可以在它支持的本地参数名称之前建立外部参数名称,并用空格分隔。例如,

func foo(xx x: Int, yy y: Int) //declares foo(xx:yy:) and 

func foo(_ x: Int, y: Int) //explicitly declares foo(_:y:) 

了解更多关于第一个参数SE-0046

相关问题