微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift如何消除泛型构造函数的歧义?

考虑以下 Swift表达式

println(Generic<Foo,Bar>(1))

通常,人们会将其视为对构造函数Generic< Foo,Bar>的通用调用.用参数(1).

println( Generic<Foo,Bar>(1) )

但是,当重新排列令牌时,它也可能代表两个单独的比较,例如,如果Generic和Foo是一些命名不佳的数字变量:

println(Generic < Foo,Bar > (1))
// or,with proper parenthesis
println((Generic < Foo),(Bar > 1))

我们在这里可以观察到的是,具有这样的通用构造函数的表达式是非常模糊的,并且即使对于人类也不容易消除歧义.这里的问题是Swift没有构造函数的新关键字,这使得它们在某些情况下与方法调用和运算符不一致.因此,我感兴趣的是Swift编译器(解析器)如何设法消除上述表达式的歧义.它的解析方式取决于上下文(类型,变量,函数)还是可以由解析器解析?

解决方法

答案很简单:编译器根本不允许您声明这些变量:

struct Generic<T,U> {

    init(_ i: Int) {}
}
struct Foo {}
struct Bar {}

print(Generic<Foo,Bar>(1))

// error
let Foo = 0      // invalid redeclaration of Foo
let Bar = 3      // invalid redeclaration of Bar
let Generic = 5  // invalid redeclaration of Generic
print(Generic<Foo,Bar>(1))

在另一个文件中创建变量或类型声明时,当前声明“覆盖”另一个声明.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐