我制作了一个自定义 Fraction 类和 Double 值的扩展,以将它们转换为这样的 Fraction。这是我的代码(简化):
class Fraction {
var wholeNumber : Int?
var numerator : Int
var denominator : Int
init(wholeNumber:Int?, numerator:Int, denominator:Int) {
guard denominator > 0 else { fatalError("Denominator can't be equal to zero or negative") }
if wholeNumber != nil && numerator < 0 { fatalError("Invalid fraction") }
self.wholeNumber = wholeNumber
self.numerator = numerator
self.denominator = denominator
}
}
双扩展:
extension Double {
init(_ fraction: Fraction) {
self = Double((fraction.wholeNumber ?? 0) * fraction.denominator + fraction.numerator) / Double(fraction.denominator)
}
}
但是我必须添加什么才能使类型转换成为可能?对于类型转换我的意思是:
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 值并对其进行转换)
编辑
我知道我可以用我的初始化程序执行Double(frac)
,但这不是我想要实现的。我想进行类型转换,例如您可以在 Float 和 CGFloat 之间进行类型转换。我提供 Double 扩展只是为了展示如何制作分数的 Double 。
正如 @JuicyFruit 所说,只有当一种类型是另一种类型的子类时,才能进行此转换,那么如何使 Fraction 成为 Double 的子类,以便可以将 Fraction 转换为 Double?
最佳答案
你应该做let double = Double(frac)
并检查Apple Documentation关于类型转换说:
Type casting is a way to check the type of an instance, or to treat that instance as a different superclass or subclass from somewhere else in its own class hierarchy.
Fraction
不是 Double
的子类,并且 Double
不能被子类化,因为它是一个 struct
。您无法将 Float
转换为 Double
: .
关于swift - 如何允许在 Swift 中自定义类型和现有类型之间进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44006482/