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

标签 swift casting swift3

我制作了一个自定义 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:example .

关于swift - 如何允许在 Swift 中自定义类型和现有类型之间进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44006482/

相关文章:

ios - 在 Apple Swift 中将字符串转换为 float 会产生与模块错误不相同的值

ios - Firebase 存储无法在 iMessage 扩展上运行

swift - 导航栏 - 重新启动应用程序后填充

C : Convert Char To Float Produce 0. 000002?

c - OSAtomicCompareAndSwapPtrBarrier 的适当转换

Swift 3 可选展开

ios - 无法使用自定义 DelegateProxy 和协议(protocol)接收事件

ios - iOS 13如何将UIDocumentPickerViewController与App Group一起使用?

arrays - Swift 2.2 和 3.0 之间的语法变化

c# - 为什么在 .NET 中转换比反射快?