Swift 为什么文字比初始值设定项产生更高效的代码?
我正在读一篇关于Swift的文章,上面写着: 在可能的情况下,与使用初始值设定项相比,更喜欢强制转换或强键入文本。初始值设定项添加一个额外的函数调用;强制转换在编译时处理。使用文字可以生成更高效的代码: 对我来说,第一种选择是纯粹的和好的 第二个选项首先初始化0,然后执行额外的强制转换操作 第三个选项只进行初始化,这很好 所以我不明白为什么第三个选项不被推荐,而第二个选项是 编辑: 既然Swift 为什么文字比初始值设定项产生更高效的代码?,swift,performance,casting,initialization,Swift,Performance,Casting,Initialization,我正在读一篇关于Swift的文章,上面写着: 在可能的情况下,与使用初始值设定项相比,更喜欢强制转换或强键入文本。初始值设定项添加一个额外的函数调用;强制转换在编译时处理。使用文字可以生成更高效的代码: 对我来说,第一种选择是纯粹的和好的 第二个选项首先初始化0,然后执行额外的强制转换操作 第三个选项只进行初始化,这很好 所以我不明白为什么第三个选项不被推荐,而第二个选项是 编辑: 既然Int有优先权,这个场景也会有相同的答案吗 let t: Int = 0 0 as
Int
有优先权,这个场景也会有相同的答案吗
let t: Int = 0
0 as Int
Int(0)
as UInt8代码>不执行任何“额外铸造操作”
它只是一个关于如何解释整数文本的类型注释。因为Int
比其他ExpressibleByIntegerLiteral
类型具有优先权。请参见此处:鉴于我们讨论的是文本的默认类型,可能还值得注意的是,给定文本的默认类型由当前模块中的“全局”XYZLiteralType的类型决定。您可以声明一个typealias来覆盖默认类型,例如在顶层定义typealias IntegerLiteralType=UInt
会在定义该typealias的模块中为整数文本UInt
创建默认类型。当您浏览Swift GitHub repo的docs目录时,您会学到一些疯狂的事情(在本例中,):D虽然我不会建议定义您自己的XYZLiteralType
——但我可以想象由此产生的各种奇怪的混淆(特别是由于它使变更模块变得更宽)@Hamish我有点希望Swift有一个更狭隘的模块概念,更像Java包。哦,你实际上可以制作一个XYZLiteralType
typealias
fileprivate
——这将它限制在给定的源文件(doh!)。我根据文档“当前模块范围上下文”的措辞假设这意味着它必须是内部的,但事实并非如此。但即使如此,我也不愿意使用它。
let t: Int = 0
0 as Int
Int(0)