当前位置: 首页 > 面试题库 >

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

微生承业
2023-03-14
问题内容

问题

  • 在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具有相同的小占用空间,即使在这里我也看不到任何直接的用途,即使在(不同于)场景中,我们确实需要对操作进行位低优化

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


问题答案:

()在处理“
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之类的功能语言中看到类似的事情。



 类似资料:
  • 给定一个具有用于初始化的帮助器方法的类: 是否可以从\u int方法注释

  • 问题内容: 我需要这样做:将值更改侦听器更改为JTextField 我想Condemwnci的解决方案,但我得到的是错误的路线: 在我的情况是: 就我而言,我想更新Jtable中的行,所以我的方法将是这样的: 我在Linux ubuntu 11.10上使用Eclipse(如果有的话)。 编辑: 我不明白为什么,但是它可以通过以下方式工作: 然后改写Implements方法,而不是全部在同一行中完成

  • 假设我有一个 我可以为任何我可能想要的结构实现,例如: 现在,我想自动我的特征,无论元组是由所有实现特征的类型组成的。直觉上,所有快乐的元组也是快乐的。 有可能做这样的事吗?例如,我可以简单地将的实现扩展到两种类型的任意元组: 因此,这可以完美地编译: 但是我怎么能把它推广到任何长度的元组呢?就我的理解而言,我们在Rust中没有变异的泛型。有变通办法吗?

  • 问题内容: 我需要保留Swift元类型的集合并编写一个函数,该函数将检查给定对象是否是其中之一的实例。我可以在Java中轻松做到这一点: 但是,我不知道如何在Swift中做到这一点: 这甚至可以在Swift中完成吗? 问题答案: 不幸的是,您目前只能对运算符使用命名类型,还不能对其使用任意的元类型值(尽管实际上 应该 可以使用IMO )。 假设您可以控制要与之进行比较的元类型的创建,则达到相同结果

  • Monoid函数的类型签名是:

  • 本文向大家介绍什么是React的实例?函数式组件有没有实例?相关面试题,主要包含被问及什么是React的实例?函数式组件有没有实例?时的应答技巧和注意事项,需要的朋友参考一下 React的实例:通过继承React.Component的类生成 函数式组件没有实例