swift – 是否有明确使用空元组()的实例(值),即类型为’Void’的实例?

题:

>对于空元组(),是否有任何可能的显式用法,作为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()生物是否有任何明确的用途(作为实例,而不是类型)?

当玩“CS”问题时,有许多地方可以使用(),这通常具有“使用Y实现X,即使你真的已经有X”.例如,我可能会说,使用Dictionary实现Set.好吧,词典是键/值对.价值的类型应该是什么?我实际上已经看到这种语言有Dictionaries而不是Sets,人们经常使用1或true作为值.但那并不是你的意思.这开辟了模糊性.如果值是假的怎么办?它是否在集合中?按照词典的方式实现Set的正确方法是[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) }
}

这应用了一系列将T取值为T的值的函数.即使T碰巧(),我们也可以使用它,但我们必须生成一堆()值才能使其工作.例如:

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

我不希望在Swift中经常出现这种情况,因为Swift主要是一种命令式语言,几乎在所有情况下都隐藏了它的Void.但是你确实看到像Scala这样的功能语言出现在命令式编程时.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...