如何在Swift中允许在自定义类型和现有类型之间进行类型转换

如何在Swift中允许在自定义类型和现有类型之间进行类型转换,swift,casting,swift3,Swift,Casting,Swift3,我制作了一个自定义分数类和一个双值扩展,将它们转换成这样的分数。这是我的代码(简化): 但是我必须添加什么才能使类型转换成为可能?对于类型转换,我的意思是: let frac = Fraction(wholeNumber: 2, numerator: 1, denominator: 2) let double = frac as! Double //Gives warning/error: "Cast from 'Fraction' to unrelated type 'Double' alwa

我制作了一个自定义分数类和一个双值扩展,将它们转换成这样的分数。这是我的代码(简化):

但是我必须添加什么才能使类型转换成为可能?对于类型转换,我的意思是:

let frac = Fraction(wholeNumber: 2, numerator: 1, denominator: 2)
let double = frac as! Double //Gives warning/error: "Cast from 'Fraction' to unrelated type 'Double' always fails"
你能不能帮我换一种方式,从双倍到分数?(我已经有了一个分数初始化器,它接受一个双精度值并将其转换)

编辑

我知道我可以用我的初始化器执行
Double(frac)
,但这不是我想要实现的。我想做的类型铸造,你可以做之间的浮动和CGFloat的例子。我提供了Double扩展,只是为了演示如何生成分数的Double。
正如@JuicyFruit所说,只有当一种类型是另一种类型的子类时,才可以进行此转换,那么我如何使分数成为Double的子类,以便将分数转换为Double?您应该执行
让Double=Double(frac)
并检查关于类型转换的说明:

类型转换是检查实例类型或处理 将该实例作为不同的超类或子类 在它自己的类层次结构中


Fraction
不是
Double
的子类,
Double
不能被子类化,因为它是
结构
。你不能将
Float
转换为
Double
:。

就几乎任何类型系统而言(包括Swift),分数
Double
是完全不相关的类型。有些语言,如C语言或C++,有一个内置的特性,可以定义这种不相关类型之间的转换行为。可以说,这引入了大量的冒烟和镜像,使代码难以遵循。斯威夫特支持更详细的方法:

let double = Double(fraction)

根据您在代码片段中提供的内容,应该是
让double=double(frac)
@AhmadF是的,当然可以,但我也希望能够在double和Float之间进行转换,例如请查看我的编辑,很抱歉,我的问题有点含糊,那么我能把分数变成一个类吗?@Eric你确定你能把
Float
转换成
Double
?我添加了截图。确实你不能。我忘了检查,我编辑了问题again@Eric再次阅读我的答案:)
Double
不能被子类化,因为它是一个
struct
好的,让分数成为Double的子类是一个好主意吗?Eric不,有几个原因:1)分数不是Double。光是这一点就足以成为不这样做的理由。2)
Double
是一个结构,结构不能被子类化(因为它们不是支持多态性或不同内存占用的引用类型)。3) 在这种情况下,语言所要求的明确性是有意的。不要试图回避它。
let frac = Fraction(wholeNumber: 2, numerator: 1, denominator: 2)
let double = frac as! Double //Gives warning/error: "Cast from 'Fraction' to unrelated type 'Double' always fails"
let double = Double(fraction)