(这可能需要一个更好的标题......)
我想要一组可以在代码中使用的访问器来快速表达持续时间。例如:
42.seconds
3.14.minutes
0.5.hours
13.days
这篇文章说明了你不能只用一个简单的新协议、扩展和强制来做到这一点IntegerType
并FloatingPointType
采用它。所以我想我会走更冗余的路线,直接扩展IntegerType
(然后重复代码FloatingPointType
)。
extension IntegerType {
var seconds:NSTimeInterval {
return NSTimeInterval(self)
}
}
产生的错误令人困惑:
Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/9325/playground131.swift:31:10: error: cannot invoke initializer for type 'NSTimeInterval' with an argument list of type '(Self)'
return NSTimeInterval(self)
^
/var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/9325/playground131.swift:31:10: note: overloads for 'NSTimeInterval' exist with these partially matching parameter lists: (Double), (UInt8), (Int8), (UInt16), (Int16), (UInt32), (Int32), (UInt64), (Int64), (UInt), (Int), (Float), (Float80), (String), (CGFloat), (NSNumber)
return NSTimeInterval(self)
让我困惑的是,它似乎说我不能用 (Self) 做一个 NSTimeInterval() 初始化程序,但是 Self 表示的所有内容都列在下一行,它显示了 NSTimeInterval 的所有可能的初始化程序。我在这里想念什么?
旁白:如果有一篇写得很好的关于 Swift 类型系统和做这些事情的教程,我会很高兴的。Apple 稀疏的 Swift 文档没有很好地涵盖中级/高级的内容
更新/澄清:
我想要的是能够评估上述任何表达式:
42.seconds --> 42
3.14.minutes --> 188.4
0.5.hours --> 1800
13.days --> 1123200
此外,我希望这些的返回类型为 NSTimeInterval(Double 的类型别名),例如:
42.seconds is NSTimeInterval --> true
3.14.minutes is NSTimeInterval --> true
0.5.hours is NSTimeInterval --> true
13.days is NSTimeInterval --> true
我知道我可以通过简单地扩展来实现这一点,Double
因此Int
:
extension Int {
var seconds:NSTimeInterval {
return NSTimeInterval(self)
}
var minutes:NSTimeInterval {
return NSTimeInterval(self * 60)
}
var hours:NSTimeInterval {
return NSTimeInterval(self * 3600)
}
var days:NSTimeInterval {
return NSTimeInterval(self * 3600 * 24)
}
}
extension Double {
var seconds:NSTimeInterval {
return NSTimeInterval(self)
}
var minutes:NSTimeInterval {
return NSTimeInterval(self * 60)
}
var hours:NSTimeInterval {
return NSTimeInterval(self * 3600)
}
var days:NSTimeInterval {
return NSTimeInterval(self * 3600 * 24)
}
}
但我也希望以下表达式起作用:
let foo:Uint = 4242
foo.minutes --> 254520
foo.minutes is NSTimeInterval --> true
不过这行不通,因为我只扩展了Int
,而不是UInt
。我可以冗余地扩展Uint
,然后UInt16
,然后Int16
,等等......
我想概括 to 的扩展,Int
如IntegerType
原始清单所示,这样我就可以获得所有整数类型的一般转换。然后对FloatingPointType
而不是专门做同样的事情Double
。但是,这会产生原始错误。我想知道为什么我不能像通常所示的那样扩展 IntegerType。除了列表中显示的之外,是否还有其他IntegerType
采用者使得 NSTimeInterval() 初始化程序无法解析?