使用LiteralConvertible的自定义文字方法

时间:2016-08-19 12:12:09

标签: swift

我正在阅读有关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中实现这种行为吗?

1 个答案:

答案 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的类型系统,能够进一步简化编译器