我正在阅读有关LiteralConvertible
协议的内容(例如,我们以StringLiteralConvertible
为例),我发现在swift 1.2中,您可以使用从文字到自定义LiteralConvertible
类型的隐式类型转换。以下示例来自NSHipster博客:
struct SomeStruct: StringLiteralConvertible {
init(stringLiteral value: String) {}
init(extendedGraphemeClusterLiteral value: String) {}
init(unicodeScalarLiteral value: String) {}
func someFunc(){}
}
可执行空间中的某个地方:
let someStruct: SomeStruct = ""
someStruct.someFunc() // ok
("" as SomeStruct).someFunc() // ok
"" is SomeStruct // ok (always true warn)
"".someFunc() // error: value of type 'String' has no member 'someFunc'
评论适用于swift 2编译器。好像swift 1.2中没有错误。我错过了什么或者没有办法在swift 2中实现这种行为吗?
答案 0 :(得分:2)
这没有意义,w.r.t。输入安全性和非歧义,如果最后一行("".someFunc()
)可以解析为恰好符合StringLiteralConvertible并且实例具有函数someFunc {}
的任何类型。协议不能知道(没有明确的测试)哪些类型符合它们,而是使用例如作为类型约束来测试给定类型是否符合协议。如果我们有另一个类型SomeStruct2: StringLiteralConvertible { ... }
也实现了someFunc()
怎么办?如果允许你描述的隐式类型转换,编译器如何解析调用"".someFunc()
?
W.r.t。对于在Swift 1.2中工作的概念:Swift 1.2在快速增长的(向上)语言方面是古老的Swift,因此在Swift 1.2中必然存在一些在“现代Swift”方面看起来很奇怪的特性。就像自定义转换方法(__conversion()
函数)一样,隐式类型转换是一种与静态类型和安全语言(例如Swift)完全不同的概念。
基于官方消息来源,我们可以看一下Swift进化提案SE-0072:
此提案涉及Swift本机和Obj-C类型之间的隐式桥接,但 Swift团队的位置 w.r.t. accepted提案[强调我的]
的说明中明确指出任何隐含的转化在Swift 1.2中,我们尝试删除所有隐式桥接转换 从语言。
...
为了进一步简化我们的类型系统和用户 模型,我们想完成这项工作并完全删除隐含 转换Swift 3中的语言转换。
...
我建议我们完全消除隐含的桥接转换 Swift 3.这意味着一些用户可能需要引入更多 代码中有显式强制转换,但我们会删除另一个特例 来自Swift的类型系统,能够进一步简化编译器。