【问题标题】:Why does CGFloat.zero exist?为什么 CGFloat.zero 存在?
【发布时间】:2020-09-10 15:41:57
【问题描述】:

苹果definedCGFloat.zero有什么特别的原因吗?我们应该什么时候使用它?和0有什么区别?

【问题讨论】:

  • 1) 考虑值为 not 0(整数),在某些情况下直接替换会导致不正确的结果; 2) 见developer.apple.com/documentation/swift/int/3127690-zero——所以把这两者放在一起就有一个很好的关于代码样式和明确性的论据。两个“不需要”都不能使用。
  • 一个很大的区别是0 不是 CGFloat。
  • @Scrrr 是否可以编辑问题以使其“可以用事实和引用来回答”?然后它可以再次重新打开。
  • @BartvanKuik 当然可以!

标签: swift core-graphics


【解决方案1】:

通用算法建立在协议之上,让我们可以编写适用于多种类型的通用代码。 AdditiveArithmetic 协议要求符合类型的类型具有零值 (.zero),可用于需要该值的算法。有了它,您可以编写一个函数来处理许多不同类型的整数(Int16、Int32、Int…)、浮点数(Double、Float、CGFloat…),甚至向量。任何具有算术零、“加法和减法”的概念并且可以相等(因为 AdditiveArithmetic 需要 Equatable)的东西都可以参与。

AdditiveArithmetic 不要求类型符合 ExpressibleByIntegerLiteral,这意味着可能无法使用 0 符号创建类型。矢量类型通常不会以这种方式初始化,但仍然具有“零值”。

作为如何使用它的示例,请考虑 sum(),它可以处理整数、浮点数、向量或任何您希望创建的符合 AdditiveArithmetic 的自定义类型:

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element {
        reduce(.zero, +)
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2010-11-12
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多