我有这样的功能:
func next(step: Int = 1){
//....
}
现在我想定义一个类型别名,以便我可以轻松地传递这个函数。
但是我无法找到声明第一个参数具有默认值的方法。我尝试过这样的事情
typealias ActionNext = (step: Int = default) -> ()
var nextFunc: ActionNext = next
但他们都给我一个错误信息,如
元组类型中不允许使用默认参数
有没有办法为这种函数定义一个类型?
答案 0 :(得分:8)
否,这是不可能的
说明:
类型别名声明将现有类型的命名别名引入程序。
(step: Int = 1) -> ()
不是一个合适的类型。类型是例如(step: Int) -> ()
,在那里不允许使用默认值。
如果你写
typealias ActionNext = (Int) -> ()
var nextFunc: ActionNext = next
有效。甚至当你写(step: Int) -> ()
但我认为你想要实现的是能够调用nextFunc()
省略参数并使用其默认值。这是不可能的。要理解原因,您可以遵循Type Alias Declaration
语法 - 在type
中无法指定默认值。
答案 1 :(得分:-2)
问题正是它所说的。您不能在类型别名中提供默认参数。
必须是这样的:
typealias ActionNext = (step: Int) -> ()
您希望能够设置默认值是徒劳的,没有意义。 (你在评论中对Swift表示失望,但幸运的是Swift在这方面做得很好。)
首先,动作是闭包,它本身也是一种类型。 类型本身不具有某种价值。类型永远不是具体的值,它是变量的无量纲特征,它是定性描述。
您需要正确理解这三个术语之间的关系: 变量 - 类型 - 值
变量是一个实体。它有三个东西 - 名称,类型和价值。
该值是类型特征的实现。
示例
您可以拥有一个名为 myDayOfRest 的变量,其类型为DayOfWeek
,其值可以为SU MO TU WE TH FR SA
。
请注意这一点 - >让myDayOfRest为DayOfWeek类型,其值为SA。
在Swift中将是
let myDayOfRest : DayOfWeek = SA
现在,当您为DayOfWeek类型创建type alias
时,基本上您只是为TYPE提供了另一个名称。永远不要去具体变量。一直到TYPE。但是,TYPE不具有某些价值,而是具有价值的变量。
希望现在你可以看到为什么期望能够在类型别名中提供默认值没有任何意义。