2015-12-15 70 views
9

比方说,我有这样的代码:我可以限制一个泛型参数*不*可选吗?

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> 
+3

我对要求不太清楚。什么样的函数可以“根本不需要任何限制”,除了一个特定的枚举被称为可选?可选有一点语言魔力,但大多数情况下,它只是一个枚举类型。我的怀疑是,你真正想做的是创建一个协议,你可以附加到你接受的类型上,而不是“任何东西,但可选”。 –

+0

“几乎没有任何限制,除了一个名为Optional的特定枚举”几乎完全是我想要的(或者更确切地说,除了'nil'之外的任何内容)。我在猜测,当你这样说时,如果没有某种依赖类型是不可能的,但是想限制一个类型只保留特定值,这对我来说就是一个非常常见的用例。 – rogueleaderr

+0

目前还不清楚你的函数如何处理“除零以外的任何值”。它有什么作用?零在Swift中并不是很神奇。这是一个合法的值('Optional.None')。它不是0或NULL或类似的东西。您可以一般地使用nil,就像您可以使用任何其他枚举值一样。它本身并不像其他语言那样危险。 –

回答

5

我能想到的最好的是超载和在运行时检查:

func hello<T>(thing: T) -> String { 
    return "hello \(thing)" 
} 

fun hello<T>(thing: T?) -> String { 
    fatalError("No optionals allowed!") 
} 

hello("swift") // fine 
hello(2)  // fine 
hello(Int("2")) // fatal error 

但我不知道发生的一种方式代之以编译时错误。

1

编辑

您可以创建一个虚拟的协议(以下NotOfOptionalType),并延长你期望通过该协议在您的泛型函数中使用的所有类型。最后,使用虚拟协议作为泛型函数中参数的类型约束; optionals不符合此类型约束,并且如果它们作为这些函数的参数发送,则会在编译时给出错误。

// dummy protocol 
protocol NotOfOptionalType {} 

extension String : NotOfOptionalType {} 
extension Int : NotOfOptionalType {} 
extension Double : NotOfOptionalType {} 
// ... extend to the types you will use 

func hello<T: NotOfOptionalType > (thing: T) -> String { 
    return "hello \(thing)" 
} 

let foo = "some" 
var bar: String? = nil 

print(hello(foo)) // compiles 
print(hello(bar)) // fails at compile time 
bar = "something" 
print(hello(bar)) // fails at compile time 
print(hello(bar!)) // compiles 
+0

我喜欢这个想法,但我只是试了一下,你好(酒吧)没有编译,但在*运行时强制转换失败*没有编译时间,所以它并不妨碍程序员'self.shootFoot()'我希望能够编译。 – rogueleaderr

+0

编辑答案:希望这会为你工作。 – dfri

相关问题