>对于空元组(),是否有任何可能的显式用法,作为Swift 2.x中的值(而不是类型)?
我知道这些空元组可以在标准意义上用于定义void函数.当我错误地定义了一个具有空元组值var a =()(type())的变量时,我开始想知道这些空元组值是否可以在某些上下文中使用.有谁知道这样的申请?
示例:使用数组和选项可能的应用程序?
作为一个例子,我们可以创建一个可选的空元组数组,当然,它只能包含nil或():
/* Optionals */ var foo: ()? = () print(foo.dynamicType) // Optional<()> var arr : [()?] = [foo] for i in 2...8 { if i%2 == 0 { arr.append(nil) } else { arr.append(foo) } } print(arr) // [Optional(()),nil,Optional(()),... ]
由于空元组的内存占用量很小,对于“boolean nil / not nil”的微内存管理来说这看起来很简洁,但由于Bool类型具有相同的小占用空间,我在这里看不到任何直接用途,即使在(不像)情景中我们真的需要对我们的运营进行低位优化.
也许我只是用一些狭窄的无法使用的应用程序追逐自己的尾巴,但无论如何:这些void()生物是否有任何明确的用途(作为实例,而不是类型)?
set[key] = ()
还有其他等效版本,例如您的Optional<()>.我也可以将整数实现为[()]或Set<()>.这有点傻,但我之前做过这样的事情来探索数论.
也就是说,这几乎都是故意不切实际的解决方案.实用的怎么样?这些通常出现在通用编程中.例如,想象一下具有这种形式的函数:
func doThingAndReturn<T>(retval: T,f: () -> Void) -> T { f() return retval }
这并不像听起来那么愚蠢.沿着这些线的东西很容易出现在Command模式中.但是,如果没有撤退呢?我不关心回报?嗯,没关系,只需传递一个()值.
func doThing(f: () -> Void) { doThingAndReturn((),f: f) }
同样,您可能需要像zipMap这样的函数:
func zipMap<T,U>(funcs: [(T) -> U],vals: [T]) -> [U] { return zip(funcs,vals).map { $0($1) } }
这应用了一系列将T取值为T的值的函数.即使T碰巧(),我们也可以使用它,但我们必须生成一堆()值才能使其工作.例如:
func gen<T>(funcs: [() -> T]) -> [T] { return zipMap(funcs,vals: Array(count: funcs.count,repeatedValue: ())) }
我不希望在Swift中经常出现这种情况,因为Swift主要是一种命令式语言,几乎在所有情况下都隐藏了它的Void.但是你确实看到像Scala这样的功能语言出现在命令式编程时.