【发布时间】:2017-01-22 00:27:34
【问题描述】:
我有一个通过泛型 T 类型接受数字类型的类,我希望能够将其转换为 CGFloat 但它会抛出:
无法使用“(T)”类型的参数列表调用“CGFloat”类型的初始化程序
我必须在课堂上做什么才能成功转换它?
CGFloat(self.top) - 这是它不喜欢的东西
'T'类型定义如下:
protocol Numeric:Comparable, Equatable {
//
init(_ v:Float)
init(_ v:Double)
init(_ v:Int)
init(_ v:UInt)
init(_ v:Int8)
init(_ v:UInt8)
init(_ v:Int16)
init(_ v:UInt16)
init(_ v:Int32)
init(_ v:UInt32)
init(_ v:Int64)
init(_ v:UInt64)
}
extension Float: Numeric {}
extension Double: Numeric {}
extension Int: Numeric {}
extension Int8: Numeric {}
extension Int16: Numeric {}
extension Int32: Numeric {}
extension Int64: Numeric {}
extension UInt: Numeric {}
extension UInt8: Numeric {}
extension UInt16: Numeric {}
extension UInt32: Numeric {}
extension UInt64: Numeric {}
class MyClass<T: Numeric> {
//...
var top:T
}
当我尝试使用 as 时,会弹出此运行时错误
无法将“Swift.Double”(0x1002b64f8) 类型的值转换为 'CoreGraphics.CGFloat' (0x1004e8740)。
【问题讨论】:
-
相关:How can I convert between related types through a common initializer?。您可以通过在您的协议要求中添加“影子方法”(例如
_asOther() -> T)来静态解决您的问题,从而允许符合协议的每种类型将自己转换为另一种类型。 -
你能根据我的例子展示一下实现吗?如果它更干净/更短等,我很乐意接受这个答案。
-
我不确定您是否会认为它更简洁或更短,但是按照我建议的方式进行操作有好处,我在下面的回答中对此进行了解释:)跨度>
标签: swift generics type-conversion