小编典典

是否有显式使用空元组()的实例(值),即类型别名'Void'的实例的可能方法?

swift

问题

  • 在Swift 2.x中,空元组是否有任何可能的显式用途(()作为 (而不是类型))?

我知道这些空元组可以在标准意义上用于定义void函数。当我错误地定义了一个空元组 var a = ()(类型为())的变量时,我开始怀疑这些空元组值是否可以在某些情况下使用。有人知道这样的应用程序吗?


示例:可能具有数组和可选属性的应用程序?

例如,我们可以创建一个可选的空元组数组,该数组自然只能包含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具有相同的小占用空间,即使在这里我也看不到任何直接的用途,即使在(不同于)场景中,我们确实需要对操作进行位低优化。


也许我只是用一些狭窄而无法使用的应用程序追逐自己的尾巴,但是无论如何:这些虚空存在任何可能的显式用法()(作为 实例 ,而不是类型)?


阅读 217

收藏
2020-07-07

共1个答案

小编典典

()在处理“
CS”问题时,有很多地方会很有用,这些地方通常具有“即使您确实已经有了X,也使用Y实现X”的形式。例如,我可以说,使用Dictionary实现Set。好吧,字典是键/值对。值的类型应该是什么?我实际上已经在具有“字典”但没有“集合”的语言中看到了这一点,并且人们经常使用1或true作为值。但这不是你真正的意思。这带来了歧义。如果值是假的怎么办?是否在场景中?按照Dictionary来实现Set的正确方法是as
[Key: ()],然后结束诸如以下代码行:

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) }
}

这将对Ttype值应用一系列函数T。即使T发生(),我们也可以使用它,但是我们必须生成一堆()值才能使它起作用。例如:

func gen<T>(funcs: [() -> T]) -> [T] {
    return zipMap(funcs, vals: Array(count: funcs.count, repeatedValue: ()))
}

我不希望在Swift中经常出现这种情况,因为Swift主要是一种命令式语言,并且Void几乎在所有情况下都将其隐藏。但是,当它们过渡到命令式编程时,您确实会在诸如Scala之类的功能语言中看到类似的事情。

2020-07-07