【问题标题】:Custom operator with optional values具有可选值的自定义运算符
【发布时间】:2018-03-31 05:36:21
【问题描述】:

我是 Swift 新手,正在为 NSDecimalNumber 制作自定义速记运算符,如下所示:

// Non-Opt
static func + (left: NSDecimalNumber, right: NSDecimalNumber) -> NSDecimalNumber { return left.adding(right) }
static func - (left: NSDecimalNumber, right: NSDecimalNumber) -> NSDecimalNumber { return left.subtracting(right) }
static func * (left: NSDecimalNumber, right: NSDecimalNumber) -> NSDecimalNumber { return left.multiplying(by: right) }
static func / (left: NSDecimalNumber, right: NSDecimalNumber) -> NSDecimalNumber { return left.dividing(by: right) }

static func += (left: inout NSDecimalNumber, right: NSDecimalNumber) { left = left + right }
static func -= (left: inout NSDecimalNumber, right: NSDecimalNumber) { left = left - right }
static func *= (left: inout NSDecimalNumber, right: NSDecimalNumber) { left = left * right }
static func /= (left: inout NSDecimalNumber, right: NSDecimalNumber) { left = left / right }

// Optional
static func + (left: NSDecimalNumber?, right: NSDecimalNumber) -> NSDecimalNumber? { return left?.adding(right) }
static func - (left: NSDecimalNumber?, right: NSDecimalNumber) -> NSDecimalNumber? { return left?.subtracting(right) }
static func * (left: NSDecimalNumber?, right: NSDecimalNumber) -> NSDecimalNumber? { return left?.multiplying(by: right) }
static func / (left: NSDecimalNumber?, right: NSDecimalNumber) -> NSDecimalNumber? { return left?.dividing(by: right) }

static func += (left: inout NSDecimalNumber?, right: NSDecimalNumber) { left = left + right }
static func -= (left: inout NSDecimalNumber?, right: NSDecimalNumber) { left = left - right }
static func *= (left: inout NSDecimalNumber?, right: NSDecimalNumber) { left = left * right }
static func /= (left: inout NSDecimalNumber?, right: NSDecimalNumber) { left = left / right }

如您所见,对于每个自定义函数,我都必须为可选值复制一个。有没有办法合并 option 和 non-optional 让它看起来不像重复的函数?

【问题讨论】:

  • 考虑到标准库中没有可选的操作符,我认为你不能合并它们。

标签: swift operators customization extension-methods optional


【解决方案1】:

您不能将两者结合起来的原因是,在底层,Optional 只是一个包含两种情况的枚举:什么都没有和某事(请参阅documentation)。因此,非可选和同一类型的可选是根本不同的。

但是,您的许多自定义运算符方法,尤其是+=-= 等,都是非常多余的。如果它们包含完全相同的实现,则无需保留这些非可选方法。您仍然可以将非可选参数传递给可选参数。

正如 Sweeper 在 cmets 中所说,不让自定义运算符包含可选参数似乎是一种常见的做法。如果您担心重复,最好不要预先检查。

【讨论】:

  • 谢谢,我会检查并删除非可选方法。我不需要 nil 检查,因为这只是 left-hand 的问题。像 var sum; sum += aNumber 这样的东西是没有意义的,并且 sum 仍然是 nil,就像它通常在 Objective-C 中一样
  • 刚刚删除了非可选方法并得到了这个错误:Binary operator '+=' cannot be applied to operands of type 'NSDecimalNumber' and 'NSDecimalNumber?'。看来我必须复制这些方法。泛型类型可以解决这些问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多