gpt4 book ai didi

swift - 协议(protocol)扩展类型自身与初始值设定项类型不匹配

转载 作者:可可西里 更新时间:2023-11-01 01:03:11 25 4
gpt4 key购买 nike

假设出于学术目的,我更喜欢这样的表达方式

someInt.asDouble

而不是股票

Double(someInt)

由于所有各种 Swift 整数类型都符合 IntegerType 协议(protocol),并且因为似乎有一个 Double() 初始化程序适合所有这些 int 类型,我以为我可以这样:

extension IntegerType {
var asDouble:Double {
return Double(self)
}
}

这是行不通的。我想知道为什么?我想知道是否有某种魔法可以让它发挥作用?可能是哪里?或者与 self 引用有关?

我在 playground 的控制台中遇到的错误是:

Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: error: cannot invoke initializer for type 'Double' with an argument list of type '(Self)'
return Double(self)
^
/var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: note: overloads for 'Double' exist with these partially matching parameter lists: (Double), (UInt8), (Int8), (UInt16), (Int16), (UInt32), (Int32), (UInt64), (Int64), (UInt), (Int), (Float), (Float80), (String), (CGFloat), (NSNumber)
return Double(self)

最佳答案

全部IntegerType类型可以提升为 IntMax , 和 IntMax可以转换为Double .

extension IntegerType {
var asDouble: Double {
return Double(self.toIntMax())
}
}

正如您所建议的,这不是一件特别有用的事情(Double(x) 是正确的语法),但它可能对解决其他问题很有用。

如果我要创建它,我会继续 stdlib 的模式。模式是 toX()而不是 asX :

extension IntegerType {
func toDouble() -> Double {
return Double(self.toIntMax())
}
}

另见 toOpaque()toUIntMax() . as建议在不复制的情况下对类型进行简单的重新解释,以及 var表明它是这个值的属性。事实并非如此。您实际上是将它转换为不同的值,以不同的格式存储,甚至可能不相等。 (对于大整数,可能存在舍入误差,例如 x != Int(x.toDouble()) 。)

也值得一读Trying to extend IntegerType (and FloatingPointType); Why can't all Int types be converted to NSTimeInterval ,它进一步讨论了这个问题,以及为什么如果不小心处理类似的功能可能会很危险。

关于swift - 协议(protocol)扩展类型自身与初始值设定项类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33656839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com