昨晚我發(fā)了一條推特邀請開發(fā)者們參與一個問題的調(diào)查。相當一部分人問我這個調(diào)查是怎么回事。
Swift 標準庫中一些類型轉(zhuǎn)換相關(guān)的協(xié)議,Matthew Johson 和我觀點相同,認為命名非常糟糕。標準庫中大約存在 80 個古怪的協(xié)議,其中大約 15% 都與類型轉(zhuǎn)換相關(guān)。
因此我們遞交了一份有關(guān)重命名的提案,不過最終被否決了。標準庫團隊傾向于使用新的 Syntax 命名空間,而我們的提案側(cè)重于命名方面的指導。他們的答復是具體問題具體分析,在不違背哲學的前提下,Swift 的革新提案需要著眼真實世界進行設(shè)計,而不是單純的理論指導。我和標準庫團隊沒能達成共識,不過討論還在持續(xù),因為 WWDC 過后這些問題還是沒能得到解決。最近 Matthew Johson 已經(jīng)在起草一份新的提案了。
當某個類型遵循 IntegerLiteralConvertible 協(xié)議后,意味著「允許一個整型字面量被解釋成該類型的實例」。想要這樣的行為發(fā)生,協(xié)議遵守者必須實現(xiàn)指定的構(gòu)造器,該構(gòu)造器接受一個 Int 類型的參數(shù)。
// 協(xié)議的遵守者可以使用整型字面量進行初始化
public protocol IntegerLiteralConvertible {
associatedtype IntegerLiteralType
// 創(chuàng)建一個實例,并用 `value` 進行初始化
public init(integerLiteral value: Self.IntegerLiteralType)
}
我認為使用下面的表達方式來闡述這個協(xié)議會更清晰:
// 遵守該協(xié)議后,協(xié)議的遵守者可以使用整型字面量表示
//
//
// let instance: T = *integer literal*
//
//
// 比如:
//
//
// let myDouble: Double = 2 // 整型字面量 2 自動轉(zhuǎn)型成了 Double
// let anotherDouble: Double = myDouble * 5 // 整型字面量 5 自動轉(zhuǎn)型成了 Double
//
//
public protocol NAME_TO_BE_DETERMINED {
// 約束整型字面量,字面量默認會被識別成Int類型
associatedtype IntegerLiteralType
// 創(chuàng)建一個實例,并用 `value` 進行初始化
// 構(gòu)造器內(nèi)部的語法必須可以被替換
public init(integerLiteral value: Self.IntegerLiteralType)
}
協(xié)議命名是一個棘手的問題。參與討論的成員建議使用 Syntax.IntegerLiteral 和 Syntax.IntegerLiteralExpressible,我認為二者都有不足的地方。而且上述的命名方式也并不能夠表達使用協(xié)議的初衷。
昨晚我向 Swift 開發(fā)者們發(fā)推詢問了有關(guān) Syntax.IntegerLiteralExpressible 的含義,這里是回復結(jié)果。大約九成的人認為它的含義是「協(xié)議的遵守者可以像整型字面量那樣來展示自己」。在這個鏈接頁面的頂部有一個標簽,你可以在「問題摘要」和「個人回答」間進行切換,然后就可以看到參與調(diào)查者對選項的解釋。
更新:戴夫·亞伯拉罕的回復:
你所提供的選項中,唯一看起來正確的答案不夠優(yōu)雅并且有一些錯誤——我曾說的是「協(xié)議遵守者的實例可以用整型字面量來表示」,你的答案大概匹配了原意的 90%,剩下的 10% 還差很多。
我只能告訴你,你的調(diào)查結(jié)果支持了我的意見。
雖然有關(guān)類型轉(zhuǎn)換的協(xié)議的適用對象只是標準庫中的類型,但是這些協(xié)議(和它們的同胞協(xié)議們一樣)可以被職業(yè)的 Swift 開發(fā)者看到、閱讀并使用。就這一點來說,我認為追求好的命名規(guī)則是有價值的。希望 Swift 能用更好的命名取代形如 Syntax.AllowsIntegerLiteralToBeInterpretedAsExpressionOfConformingType 這樣的協(xié)議命名。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg。