我正在从一本书中学习Swift,我们正在使用Playgrounds来建立一个班级。我收到一条错误,上面写着:未命名的参数必须用空名'_'写。
我理解Swift中的下划线意味着“忽略”但是如果我添加一个下划线后跟一个空格,那么我收到错误:参数需要一个相当容易理解的显式类型,这意味着参数必须声明为某种类型。 :)
我想知道错误的“未命名的参数必须用空名'_'写的是什么”试图用非专业术语来说,因为它对像我这样的菜鸟没有多大意义。
以下是操场上的代码:
ID 2014Through2016 2015Through2016 2016
--------------------------------------------
1 1 1 1
2 0 1 1
3 0 0 0
4 0 0 0
答案 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
当paramLabel
和paramName
相同时,它可以是这样的:
func functionName(paramName: ParamType) -> ResultType
您可以将_
用于paramLabel
和paramName
,因此这是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 {