【问题标题】:Do Int and Double share a common parent class in SwiftInt 和 Double 在 Swift 中是否共享一个公共父类
【发布时间】:2015-05-28 13:25:58
【问题描述】:

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

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 的代码,并且缺少将它们联系在一起的任何真实内容。

【问题讨论】:

  • 它们共享许多共同的协议——它们都是AbsoluteValuableComparableIntegerLiteralConvertible。查看SwiftDoc 以轻松了解完整的层次结构。但要真正回答这个问题,需要更多关于您正在初始化的类的信息——这实际上取决于super.init 中的value: 是什么。
  • 它需要一个 Double 来初始化,但是,我想我可以将任何类(包括)double 包装在一个 Double 中,它应该可以工作。
  • IntDouble 是结构,而不是类

标签: swift generics int double


【解决方案1】:

看看 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

如果可以为所有这些不同的数字类型编写一个通用函数,他们肯定会这样做。所以你的问题的答案一定是否定的。

(而且在任何情况下,它们都很难共享父 class,因为它们不是 classes。它们是结构体。)

当然,如果只有 Int 和 Double 存在问题,可以扩展 Int 和 Double 以采用通用协议并使该协议成为预期类型...

【讨论】:

  • 这是一个误导性的答案。这取决于用例。虽然这些类型需要它们自己的加法运算符,但完全有可能在所有整数上定义广泛的运算类别,例如func sum&lt;S: SequenceType where S.Generator.Element: IntegerType&gt;(seq: S) -&gt; S.Generator.Element { return reduce(seq,0) { $0 + $1 } }。也就是说,很少有协议可以同时连接整数和浮点数。
  • @AirspeedVelocity 其实我只是在等你来给我正确的答案。请给它!
  • 仅供参考:从 Swift 4.0 开始,该协议已被弃用。
  • @KirillTitov 这是否意味着现在不能从数字类型中创建字符串?
猜你喜欢
  • 2014-10-16
  • 2011-02-19
  • 2011-12-27
  • 2011-04-21
  • 2012-08-08
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多