在Swift中,Int和Double共享一个共同的父类吗?

s5a0g9ez  于 2024-01-05  发布在  Swift
关注(0)|答案(2)|浏览(151)

我想知道是否有更简单的方法将这两个初始化器编写为泛型初始化器

public required init(_ value : Double) {
    super.init(value: value, unitType: unit)
}

public required init(_ value : Int) {
    let v = Double(value)
    super.init(value: v, unitType: unit)
}

字符串
类似于:

public init<T>(_value : T) {
    let v = Double(T)
    super.init(value: v, unitType: unit)
}


(当然不能编译)
我已经看过Int和Double的代码了,我缺少任何将它们联系在一起的真实的东西。

e1xvtsh3

e1xvtsh31#

看看Swift的头文件:

extension String : StringInterpolationConvertible {
    init(stringInterpolationSegment expr: String)
    init(stringInterpolationSegment expr: Character)
    init(stringInterpolationSegment expr: UnicodeScalar)
    init(stringInterpolationSegment expr: Bool)
    init(stringInterpolationSegment expr: Float32)
    init(stringInterpolationSegment expr: Float64)
    init(stringInterpolationSegment expr: UInt8)
    init(stringInterpolationSegment expr: Int8)
    init(stringInterpolationSegment expr: UInt16)
    init(stringInterpolationSegment expr: Int16)
    init(stringInterpolationSegment expr: UInt32)
    init(stringInterpolationSegment expr: Int32)
    init(stringInterpolationSegment expr: UInt64)
    init(stringInterpolationSegment expr: Int64)
    init(stringInterpolationSegment expr: UInt)
    init(stringInterpolationSegment expr: Int)
}

字符串
同样:

func +(lhs: UInt8, rhs: UInt8) -> UInt8
func +(lhs: Int8, rhs: Int8) -> Int8
func +(lhs: UInt16, rhs: UInt16) -> UInt16
func +(lhs: Int16, rhs: Int16) -> Int16
func +(lhs: UInt32, rhs: UInt32) -> UInt32
func +(lhs: Int32, rhs: Int32) -> Int32
func +(lhs: UInt64, rhs: UInt64) -> UInt64
func +(lhs: Int64, rhs: Int64) -> Int64
func +(lhs: UInt, rhs: UInt) -> UInt
func +(lhs: Int, rhs: Int) -> Int
func +(lhs: Float, rhs: Float) -> Float
func +(lhs: Double, rhs: Double) -> Double
func +(lhs: Float80, rhs: Float80) -> Float80


如果有可能为所有不同的数值类型编写一个泛型函数,他们肯定会这样做。所以你的问题的答案肯定是否定的。
(And在任何情况下,它们几乎不能共享父类,因为它们不是类,而是结构。)
当然,现在,如果只有Int和Double有问题,* 你 * 可以扩展Int和Double来采用一个公共协议,并使该协议成为预期的类型。

cngwdvgl

cngwdvgl2#

您可以将类型SignedNumericany关键字一起使用。
Swift 5.9的例子:

let numbers: [any SignedNumeric] = [
  Double(0.0),
  Int(0),
]

for number in numbers {
  if let aDouble = number as? Double {
    print ("double value \(aDouble)")
  } else {
    print ("int value \(number)")
  }
}

字符串

相关问题