昨晚我发了一条推特邀请开发者们参与一个问题的调查。相当一部分人问我这个调查是怎么回事。
Swift 标准库中一些类型转换相关的协议,Matthew Johson 和我观点相同,认为命名非常糟糕。标准库中大约存在 80 个古怪的协议,其中大约 15% 都与类型转换相关。
因此我们递交了一份有关重命名的提案,不过最终被否决了。标准库团队倾向于使用新的 Syntax
命名空间,而我们的提案侧重于命名方面的指导。他们的答复是具体问题具体分析,在不违背哲学的前提下,Swift 的革新提案需要着眼真实世界进行设计,而不是单纯的理论指导。我和标准库团队没能达成共识,不过讨论还在持续,因为 WWDC 过后这些问题还是没能得到解决。最近 Matthew Johson 已经在起草一份新的提案了。
当某个类型遵循 IntegerLiteralConvertible
协议后,意味着「允许一个整型字面量被解释成该类型的实例」。想要这样的行为发生,协议遵守者必须实现指定的构造器,该构造器接受一个 Int
类型的参数。
// 协议的遵守者可以使用整型字面量进行初始化 public protocol IntegerLiteralConvertible { associatedtype IntegerLiteralType // 创建一个实例,并用 `value` 进行初始化 public init(integerLiteral value: Self.IntegerLiteralType) }
我认为使用下面的表达方式来阐述这个协议会更清晰:
// 遵守该协议后,协议的遵守者可以使用整型字面量表示 // // // let instance: T = *integer literal* // // // 比如: // // // let myDouble: Double = 2 // 整型字面量 2 自动转型成了 Double // let anotherDouble: Double = myDouble * 5 // 整型字面量 5 自动转型成了 Double // // public protocol NAME_TO_BE_DETERMINED { // 约束整型字面量,字面量默认会被识别成Int类型 associatedtype IntegerLiteralType // 创建一个实例,并用 `value` 进行初始化 // 构造器内部的语法必须可以被替换 public init(integerLiteral value: Self.IntegerLiteralType) }
协议命名是一个棘手的问题。参与讨论的成员建议使用 Syntax.IntegerLiteral
和 Syntax.IntegerLiteralExpressible
,我认为二者都有不足的地方。而且上述的命名方式也并不能够表达使用协议的初衷。
昨晚我向 Swift 开发者们发推询问了有关 Syntax.IntegerLiteralExpressible
的含义,这里是回复结果。大约九成的人认为它的含义是「协议的遵守者可以像整型字面量那样来展示自己」。在这个链接页面的顶部有一个标签,你可以在「问题摘要」和「个人回答」间进行切换,然后就可以看到参与调查者对选项的解释。
更新:戴夫·亚伯拉罕的回复:
你所提供的选项中,唯一看起来正确的答案不够优雅并且有一些错误——我曾说的是「协议遵守者的实例可以用整型字面量来表示」,你的答案大概匹配了原意的 90%,剩下的 10% 还差很多。
我只能告诉你,你的调查结果支持了我的意见。
虽然有关类型转换的协议的适用对象只是标准库中的类型,但是这些协议(和它们的同胞协议们一样)可以被职业的 Swift 开发者看到、阅读并使用。就这一点来说,我认为追求好的命名规则是有价值的。希望 Swift 能用更好的命名取代形如 Syntax.AllowsIntegerLiteralToBeInterpretedAsExpressionOfConformingType
这样的协议命名。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。