Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 协议扩展类型Self与初始值设定项类型不匹配_Swift_Swift Extensions_Swift2.1_Swift Protocols - Fatal编程技术网

Swift 协议扩展类型Self与初始值设定项类型不匹配

Swift 协议扩展类型Self与初始值设定项类型不匹配,swift,swift-extensions,swift2.1,swift-protocols,Swift,Swift Extensions,Swift2.1,Swift Protocols,比如说,出于学术目的,我更喜欢这样的表达 someInt.asDouble 而不是股票 Double(someInt) 由于所有不同的Swift整数类型都符合IntegerType协议,而且似乎有一个Double()初始值设定项适合所有类型的整数类型,我想我可以这样做: extension IntegerType { var asDouble:Double { return Double(self) } } 这是行不通的。我想知道为什么?我想知道是否有什么魔

比如说,出于学术目的,我更喜欢这样的表达

someInt.asDouble
而不是股票

Double(someInt)
由于所有不同的Swift整数类型都符合
IntegerType
协议,而且似乎有一个
Double()
初始值设定项适合所有类型的整数类型,我想我可以这样做:

extension IntegerType {
    var asDouble:Double {
        return Double(self)
    }
}
这是行不通的。我想知道为什么?我想知道是否有什么魔法能让它发挥作用?A
可能在哪里?还是与
自我
参考有关

在我尝试过的游乐场控制台中出现的错误如下:

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()
touitmax()
as
建议在不复制的情况下对类型进行简单的重新解释,
var
建议它是此值的一个属性。事实并非如此。实际上,您正在将其转换为不同的值,以不同的格式存储,甚至可能不相等。(对于大整数,可能存在舍入错误,例如
x!=Int(x.toDouble())


这本书也值得一读,它进一步讨论了这个问题,以及为什么类似的功能可能会很危险,除非非常小心。

如果你是一名编译器,你如何找出哪个版本是正确的?这是不可能的。有很多类似的问题。我们的问题是要理解swift it类型安全语言……
Int
才是具有价值的东西。没有一个协议符合它。@RMenke这是否意味着协议扩展不能引用
self
?@Rob Napier excellent!!真的很有用的答案@Rob Napier如何处理浮点类型??请参阅。整个方法都是毫无用处的,因为在这种情况下,
Double(x)
是更好的解决方案,我在链接答案的底部给出了
NSTimeInterval
的更好解决方案。但从理论上讲,它可能对其他一些超越其危险的事物有用。(我也在链接答案中解释了危险。)@Rob Napier我需要“通用”版本的数学函数。在标准库中有,例如,圆形(双精度)、圆形(浮动)。。。。我可以先把所有的东西都转换成两倍,但我不知道如何转换。FloatingPointType是否存在类似于.toIntMax()的内容?请参阅前面链接的问题(上面的最后一段)。我在那里提供了一个
TimeIntervalConvertible
协议
DoubleConvertible
将是相同的。我还解释了为什么转换为
Double
与转换为
IntMax
不同,因此必须小心。