具有可选值的自定义操作员



我是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 }

您可以看到,对于每个自定义功能,我必须复制一个以获取可选值。有没有办法合并选项和非选项,因此看起来不像重复的功能?

您无法结合两者的原因是,在引擎盖下,可选的只是两种情况的枚举:什么都没有(请参阅文档(。因此,同一类型的非可行性和可选性在根本上是不同的。

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

正如Scheeper在评论中所说的那样,没有自定义操作员包含可选论点似乎是普遍的做法。如果您担心重复的话,您可能会更好地进行NIL检查。

最新更新