Swift:添加可选整数
Posted
技术标签:
【中文标题】Swift:添加可选整数【英文标题】:Swift: adding optionals Ints 【发布时间】:2014-06-27 13:04:45 【问题描述】:我声明如下:
var x:Int?
var y:Int?
我想要第三个变量z
,它包含x
和y
的总和。据推测,x
& y
是可选的,z
也必须是可选的:
var z:Int? = x + y
但这会产生编译器错误“可选类型'Int?'的值没有打开;你是不是要使用“!”或'?'"
如果我打开 x
& y
:
var z:Int? = x! + y!
我收到一个运行时错误,因为 x
和 y
为零,因此无法解包。
我可以达到预期的效果如下:
var z:Int?
if let x1 = x
if let y1 = y
z = x1+y1
但这对于将 2 个整数相加似乎有点冗长!有没有更好的方法来实现这一点?
【问题讨论】:
如果 y 或 x 为 nil,您要忽略吗?然后使用??操作员。让 z = (y ?? 0) + (x ?? 0) 【参考方案1】:这是我的看法,我认为它更干净:
let none:Int? = nil
let some:Int? = 2
func + (left: Int?, right:Int?) -> Int?
return left != nil ? right != nil ? left! + right! : left : right
println(none + none)
println(none + some)
println(some + none)
println(some + some)
println(2 + 2)
结果:
nil
Optional(2)
Optional(2)
Optional(4)
4
【讨论】:
【参考方案2】:我能想到的最好的是:
if x && y
z = x! + y!;
由于它们都是可选的......真的没有办法避免:
-
检查他们不是
nil
在添加之前打开它们。
【讨论】:
“我为什么要 Optional Ints?”:没有理由——这纯粹是理论上的。 @AshleyMills 这种方式可以工作,但因为 Swift 语言。应该比 Obj-C 更清晰,这个例子在维护过程中会很难理解。让你的代码简单! 似乎可选链接会是一个不错的解决方案,但它只适用于对象方法、属性等。【参考方案3】:IMO 最佳解决方案:
z = x.map x in y.map $0 + x
您知道Optional<T>
上的地图操作员吗?这是很不错的。
文档说:
如果 self == nil,则返回 nil。否则,返回 f(self!)。
【讨论】:
好一个。或flatMap
.
@AuRis 是的,你可以,flatMap
返回一个 Optional<T>
,在这种情况下不需要,因为当有实际值时我们肯定会返回一些东西
这是思考问题的正确方法,干得好【参考方案4】:
这完全取决于您要实现的目标,但您可以使用可选的元组来实现:
var xy: (Int, Int)?
var z: Int
if let (x1, y1) = xy
z = x1 + y1 // Not executed
xy = (3, 4)
if let (x1, y1) = xy
z = x1 + y1 // 7
更新 正如@Jack Wu 指出的那样,这改变了语义。如果你愿意更详细一点,你可以这样做:
func optIntAdd(x: Int?, y: Int?) -> Int?
if let x1 = x
if let y1 = y
return x1 + y1
return nil
operator infix +!
@infix func +! (x: Int?, y: Int?) -> Int?
return optIntAdd(x, y)
var x: Int?
var y: Int?
var z: Int?
z = x +! y // nil
x = 1
z = x +! y // nil
y = 2
z = x +! y // 3
不确定“+!”对运算符来说是一个有用的名称选择,但它不会让我选择“+?”。
【讨论】:
这改变了事物的语义...xy
不能是(3, nil)
正确。除了编写一个接受可选参数并返回一个可选参数的函数之外,我看不出如何做到这一点,这似乎有点复杂 - 正如我在答案中所说,“这完全取决于你想要实现的目标。”
嗯……运算符重载和添加 2 个整数的函数……这不是 Swift 最好的时刻之一。
啊……但它们是不是整数——它们是可选的整数! :)【参考方案5】:
z = (x ?? 0) + (y ?? 0)
* 在 Xcode 9 上工作 *
【讨论】:
感谢您的确认【参考方案6】:使用可选链:
z = x? + y?
【讨论】:
是的,这就是我希望它的工作方式。或者只是z = x + y
和如果任何一个 RHS 为 nil,z 为 nil。
如前所述,这不起作用。我不在一个可以实际测试它的环境中,只是抛出了一些看起来应该可以工作的东西:)以上是关于Swift:添加可选整数的主要内容,如果未能解决你的问题,请参考以下文章