必须使用空名称'_'写入未命名的参数是什么意思?

时间:2017-07-10 23:08:18

标签: swift parameters

我正在从一本书中学习Swift,我们正在使用Playgrounds来建立一个班级。我收到一条错误,上面写着:未命名的参数必须用空名'_'写。

我理解Swift中的下划线意味着“忽略”但是如果我添加一个下划线后跟一个空格,那么我收到错误:参数需要一个相当容易理解的显式类型,这意味着参数必须声明为某种类型。 :)

我想知道错误的“未命名的参数必须用空名'_'写的是什么”试图用非专业术语来说,因为它对像我这样的菜鸟没有多大意义。

以下是操场上的代码:

ID  2014Through2016    2015Through2016  2016
--------------------------------------------
1    1                      1             1
2    0                      1             1
3    0                      0             0
4    0                      0             0

3 个答案:

答案 0 :(得分:2)

我猜,当你获得 unnamed parameters must be written with the empty name '_' 时,你的代码是这样的。

func open(Void)->String{
    opened = true
    return "C-r-r-e-e-a-k-k-k...the door is open!"
}

似乎你是一位经验丰富的C程序员。

在Swift中,单参数函数(包括方法)应该有这种标题:

func functionName(paramLabel paramName: ParamType) -> ResultType

paramLabelparamName相同时,它可以是这样的:

func functionName(paramName: ParamType) -> ResultType

您可以将_用于paramLabelparamName,因此这是Swift中的有效函数头,当一个参数应该传递给函数并且不使用它时在函数体内:

func functionName(_: ParamType) -> ResultType

但是在旧的Swift中,你可以在同样的情况下写出这样的东西:

func functionName(ParamType) -> ResultType

这不是当前Swift中的有效函数头。因此,当Swift编译器找到这种函数头时,它会生成一条诊断消息,如: unnamed parameters must be written with the empty name '_' ,建议您在_:之前需要ParamType。< / p>

您需要的实际修复包含在Lawliet的答案中。当函数不带参数时,您无需在参数内放置Void

func open()->String{
    opened = true
    return "C-r-r-e-e-a-k-k-k...the door is open!"
}

答案 1 :(得分:1)

参数需要显式类型。因此,func open(_ Void)->String函数声明会导致编译错误。如果您只想编写一个没有参数的函数,请删除_ Void

func open()->String{
    opened = true
    return "C-r-r-e-e-a-k-k-k...the door is open!"
}

根据Apple的Swift一书,下划线(_)可以在Swift的各种情况下使用。

功能:如果您不想要参数的参数标签,可以使用_而不是使用显式参数。

func sumOf(_ arg1: Int, arg2: Int) -> Int{
    return arg1 + arg2
}
sumOf(1, arg2: 5)

数字文字:Int和Float都可以包含_以提高可读性。

let oneBillion = 1_000_000_000
let justOverOneThousand = 1_000.000_1 

控制流:如果您不需要序列中的每个值,则可以使用_(即Wildcard Pattern)代替变量名。

let base = 2
let power = 10
var result = 1

for _ in 1...power {
    result *= base
}

元组:您可以使用_忽略元组的某些部分。

let http404Error = (404, "Not Found")

// Decompose to get both values
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")

// Decompose to get the status code only
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")

答案 2 :(得分:1)

根据我的理解,这是来自客观C的一种实践,它在迅速得到承认和尊重。在目标C样式中,您可以为参数命名,但是当您出于描述或可读性目的而不需要它们时,您可以使用_。这是一个例子

init(_ parameter: Type)

Objective C协议也遵循这个命名约定 -

tableView(_ tableView: UITableView.......)

// in swift

protocol MyCustomProtocol: AnyObject {
    func controller(_ controller: MyCustomControllerClass, DidFinishLoadingSomething something: Type)
}

如果您想在功能中命名参数,可以 -

class CustomClass {
    init(withUserId id: String)
}
// to use the above:
CustomClass(withUserId: "123123")

func insert(newIndexPath indexPath: IndexPath)
... 
insert(newIndexPath: myNewIndexPath) // This is how you would use the above function

为了帮助您解决问题,您指定了func open不需要参数名称。但是你从未指定过你的参数。如果您确实要传递参数,请将其命名为func open(_ open: Bool) -> String {,或者如果您不想要该功能的参数,请使用func open() -> String {