问题 :
()
我知道这些空元组可以在标准意义上用于定义void函数。当我错误地定义了一个空元组 值 var a = ()(类型为())的变量时,我开始怀疑这些空元组值是否可以在某些情况下使用。有人知道这样的应用程序吗?
var a = ()
示例:可能具有数组和可选属性的应用程序?
例如,我们可以创建一个可选的空元组数组,该数组自然只能包含nil或():
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(()), ... ]
由于空元组的内存占用量很小,对于“布尔nil / not nil”的微内存管理来说,这看起来很整齐,但是由于类型Bool具有相同的小占用空间,即使在这里我也看不到任何直接的用途,即使在(不同于)场景中,我们确实需要对操作进行位低优化。
Bool
也许我只是用一些狭窄而无法使用的应用程序追逐自己的尾巴,但是无论如何:这些虚空存在任何可能的显式用法()(作为 实例 ,而不是类型)?
()在处理“ CS”问题时,有很多地方会很有用,这些地方通常具有“即使您确实已经有了X,也使用Y实现X”的形式。例如,我可以说,使用Dictionary实现Set。好吧,字典是键/值对。值的类型应该是什么?我实际上已经在具有“字典”但没有“集合”的语言中看到了这一点,并且人们经常使用1或true作为值。但这不是你真正的意思。这带来了歧义。如果值是假的怎么办?是否在场景中?按照Dictionary来实现Set的正确方法是as [Key: ()],然后结束诸如以下代码行:
[Key: ()]
set[key] = ()
还有其他等效版本,例如Optional<()>。我也可以将整数实现为[()]或Set<()>。这有点愚蠢,但是我以前做过类似的事情来探索数论。
Optional<()>
[()]
Set<()>
也就是说,这些几乎都是故意的不切实际的解决方案。实用的怎么样?这些通常在通用编程中显示。例如,想象一个具有这种形式的函数:
func doThingAndReturn<T>(retval: T, f: () -> Void) -> T { f() return retval }
这听起来并不傻。这些内容很容易以Command模式显示。但是如果没有撤退怎么办?我不在乎退货吗?好吧,很好,只需传递一个()值即可。
func doThing(f: () -> Void) { doThingAndReturn((), f: f) }
同样,您可能想要一个类似zipMap以下的函数:
zipMap
func zipMap<T, U>(funcs: [(T) -> U], vals: [T]) -> [U] { return zip(funcs, vals).map { $0($1) } }
这将对Ttype值应用一系列函数T。即使T发生(),我们也可以使用它,但是我们必须生成一堆()值才能使它起作用。例如:
T
func gen<T>(funcs: [() -> T]) -> [T] { return zipMap(funcs, vals: Array(count: funcs.count, repeatedValue: ())) }
我不希望在Swift中经常出现这种情况,因为Swift主要是一种命令式语言,并且Void几乎在所有情况下都将其隐藏。但是,当它们过渡到命令式编程时,您确实会在诸如Scala之类的功能语言中看到类似的事情。
Void