比方说,我有这样的代码:我可以限制一个泛型参数*不*可选吗?
func hello<T>(thing: T) -> String {
return "hello \(thing)"
}
我可以写一个版本的hello
功能,如果它通过一个可选的,将无法编译的?
let foo = "some"
let bar: String? = nil
print(helloNoOptional(foo)) // should compile
print(helloNoOptional(bar)) // should not compile
我想,也许这是可行的与协议一致性或where
条款对T,但我想不出究竟会工作。
我想这样做的原因是因为我正在处理遗留代码库中的实际功能,如果thing
为零,则没有明显的行为。因此,我宁愿阻止hello
被选中,而不是在打开thing
以解决问题,并试图找出明智的错误行为。
更新:
一条可行的途径......我意识到,可选枚举符合NilLiteralConvertible
协议。因此,如果我可以找到一种方法来将我的泛型限制为而不是符合某种类型,我可以事实上排除选项。但我不知道是否有可能像做
<T where !T: NilLiteralConvertible>
我对要求不太清楚。什么样的函数可以“根本不需要任何限制”,除了一个特定的枚举被称为可选?可选有一点语言魔力,但大多数情况下,它只是一个枚举类型。我的怀疑是,你真正想做的是创建一个协议,你可以附加到你接受的类型上,而不是“任何东西,但可选”。 –
“几乎没有任何限制,除了一个名为Optional的特定枚举”几乎完全是我想要的(或者更确切地说,除了'nil'之外的任何内容)。我在猜测,当你这样说时,如果没有某种依赖类型是不可能的,但是想限制一个类型只保留特定值,这对我来说就是一个非常常见的用例。 – rogueleaderr
目前还不清楚你的函数如何处理“除零以外的任何值”。它有什么作用?零在Swift中并不是很神奇。这是一个合法的值('Optional.None')。它不是0或NULL或类似的东西。您可以一般地使用nil,就像您可以使用任何其他枚举值一样。它本身并不像其他语言那样危险。 –