在函数类型中,您可以编写
()->()?
它建立得很好!什么是()?
?
答案 0 :(得分:3)
() -> ()?
定义更高阶的类型,将空元组 ()
作为参数,并返回空元组的Optional
Optional<()>
或者,?
使用Optional
糖,只需()?
。
有一个名为Void
的空元组的typedef,所以以下所有都是等效的高阶类型:
() -> ()?
() -> Optional<()>
() -> Void?
() -> Optional<Void>
应用于闭包时的示例:
// c1 through c4 all have the same type, but use
// typedefs (Void) or optional sugar (?) for variations.
var c1: () -> ()? = { return nil }
let c2: () -> Optional<()> = c1
let c3: () -> Void? = c1
let c4: () -> Optional<Void>? = c1
请注意,()
也是空元组的实例(除了用作 type 之外),这意味着我们可以 - 分配例如上面的可变闭包c1
返回值 ()
:
c1 = { return () }
c1 = { return .some(()) }
另一方面,由于Void
只是空元组类型的typedef,我们需要显式实例化非可选(命名)Void
实例,如果我们想要返回“空元组实例”而不实际使用()
值(并且仅使用Void
typedef):
c1 = {
let v: Void
return v
}
通常声明一个非可选的不可变属性而不为其指定值是Swift中的一个错误,但由于Void
typedef,即空元组,只能容纳一个值(()
),Swift编译器似乎足够聪明,允许省略将此唯一可能的值分配给上面的v
(或者,对于非常特殊的空元组类型的特殊情况)。
最后,请注意所有非可选的()
- 返回闭包或函数都可以省略返回值,并且在函数声明中,也省略了类型:
// Now studying the case of non-optional () return
var c6: () -> () = { print("Implicit () return") }
func f1() { print("Implicit return type, implicit () return") }
func f2() { print("Implicit return type, explicit () return"); return () }
func f3() -> () { print("Explicit return type, implicit () return") }
func f4() -> () { print("Explicit return type, explicit () return"); return () }
c6 = f1
c6 = f2
c6 = f3
c6 = f4
let emptyTupleInstance = c6() // "()"
答案 1 :(得分:1)
是。
()?
表示可选的void。我曾经把它写成(虚空)?
不要认为可选和无效是一回事。他们绝对不是。基本上:'void'是一种类型,而null是[特殊]值。
这应该有助于解释它。 Swift - Optional Void